設計模式中類之間的關系

設計模式

個人感覺設計模式是程序員的核心技能= =,然后看了一些設計模式的書,都是講設計模式的一些理論,放在實現上都有點模糊,后來圖書館看到一本《設計模式的藝術》,感覺很不錯,有一些比較具體且容易理解的實現方式,做個記錄和分享。

類的關系實現

關聯(Association)關系

這個就是比較常見的一種了,就是類和類之間的關系,互相存在關聯,比如汽車和輪胎,班級和學生,不同的關聯關系具體要求不一樣,比如雙向關聯要求兩個類都有相互之間的引用,而單向只能存在一方對另一方的引用,下面具體展開。
關聯關系一共有六種如下:

  1. 雙向關聯
  2. 單向關聯
  3. 自關聯
  4. 多重性關聯
  5. 聚合關系
  6. 組合關系

PS:礙于時間關系,下面的實例沒有作關系圖,有時間多的話補上。

雙向關聯

默認情況下,關聯是雙向的。
下面講顧客購買商品和商品被賣給顧客之間的關系,顧客購買商品后擁有商品,商品被賣出后與某個顧客相關聯,實際上存在雙向的引用,代碼如下:

public class Customer{private Product[] products;...
}
public class Product{private Customer customer;...
}

單向關聯

每個顧客都有一個家庭地址,但是這個地址沒辦法包含顧客,所以這邊是單向的關系,實現代碼如下:

public class Customer{private Address[] address;...
}

自關聯

引用指向自己的類型,這和遞歸不同,遞歸是調用本身方法,這是引用本身類型的對象。示例代碼如下:

public class Node {private Node subNode;...
}

多重性(Multiplicity)關聯

這個關聯關系表示兩個類型的對象在數量上之間的對應關系
換句話說就是另一個類的對象可以擁有幾個該對象(從m到n的范圍)

表示方式多重性說明
1..1表示另一個類的一個對象只與該類的一個對象有關系
0..*表示另一個類的一個對象與該類的零個或者多個對象有關系
1..*表示另一個類的一個對象與該類的一個或者多個對象有關系
0..1表示另一個類的一個對象沒有或只與該類的一個對象有關系
m..n表示另一個類的一個對象與該類的零個或者多個對象有關系
 舉例:public class Form{private Button[] buttons;  //定義為成員變量...}public class Button{...}

聚合(Aggregation)關系

聚合關系表示整體與部分的聯系,值得注意的一點就是部分離開了整體也能存在,在實現的過程中通常是通過構造方法,Setter或業務方法等把成員對象注入到整體對象中。實現代碼如下(汽車和發動機):

public class Car{private Engine engine;//構造注入public Car(Engine engine){this.engine = engine;}//設值注入public void setEngine(Engine engine){this.engine = engine;}...
}
public class engine{...
}

組合(Composition)關系

組合關系有一個很大的不同于之前的特點就是,組合一般會在對象初始化的時候創建成員對象(new),也就是在構造方法中直接實例化成員類。并且成員變量(對象)無法脫離整體對象,例如嘴巴不在臉上就沒辦法存在,實現代碼如下:

public class Head{private Mouth mouth;public Head(){mouth = new mouth();}...
}
public class Mouth(){...
}

依賴(Deoendency)關系

依賴關系簡單的理解就是特定事物的改變有可能會影響到使用該事物的其他事物,在需要表示一個事物使用另一個事物時使用依賴關系,多數情況下,依賴關系體現在某個類的方法使用另一個類的對象作為參數。例如汽車的移動方式改變,會影響到駕駛員(開車)。(drive方法依賴move方法)實現代碼如下:

public class Driver{public void drive(Car car){car.move;}
}
public class Car{public void move(){...}
}

泛化(Generalization)關系

這個比較容易理解,就是繼承關系,用于描述父類和子類之間的關系。不做具體介紹,直接放代碼:

//父類
public class Person{protected String name;protected int age;public void move(){}public void say(){}
}
//子類
public class Student extends Person{private String studentNo;public void tech(){...}
}
//子類
public class Teacher extends Person{private String teacherNo;public void teach(){}
}

接口與實現關系

面向對象的語言大多數都有接口概念,在接口中,通常沒有屬性,而且所有的操作都是抽象的,只有操作的聲明,沒有操作的實現,接口和接口與也可以依賴和繼承,但是接口和類之間還存在一種實現的關系。

public interface Vehicle{public void move();
}
public class Ship implements Vehicle{public void move(){...}
}
public class Car implements Vehicle{public void move(){...}
}

面向對象設計的原則

一共有七個,這個比較常見,然后書中有關于使用頻率的介紹,這個我覺得也很實用。

單一指責

開閉原則

里氏代換原則

依賴倒轉原則

接口隔離

合成復用

迪米特法則

有空補充

轉載于:https://www.cnblogs.com/didadida/p/10141714.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何查看jar包的版本號?

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 jar包根目錄里的META-INF目錄下的MANIFEST.MF文件里一般有會記錄版本信息,可以到這個文件里查看 打開Java的JAR文件我們經…

JAVA中的toString()方法的用法

toString是Object類的方法,所有類都從Object類繼承。如果你定義的類沒有覆蓋toString方法,則對象在調用toString方法時用的是Object類toString方法,返回的是“類名hashcode". System.out.println(obj)在參數是一個對象時,會首…

kotlin使用spring data jpa(一)

2019獨角獸企業重金招聘Python工程師標準>>> 簡單查詢 spring data jpa是spring全家桶成員之一,用于操作各種數據庫,下面寫一個查詢訂單的簡單示例 引入sqlserver驅動包及jpa所需包implementation(org.springframework.boot:spring-boot-star…

VC的函數修飾名

VC 中的修飾名(Decoration name) “C”或者“C”函數在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字 符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“C”重載函數、構造函數、…

You can‘t specify target table ‘XXX‘ for update in FROM clause

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 報錯如題,意思大致是:在一條 sql 語句中不能先查出來部分內容,再同時又對當前表作修改。 解決方法&…

牛客網——最簡真分數

題目描述 給出n個正整數&#xff0c;任取兩個數分別作為分子和分母組成最簡真分數&#xff0c;編程求共有幾個這樣的組合。輸入描述: 每組包含n&#xff08;n<600&#xff09;和n個不同的整數&#xff0c;整數大于1且小于等于1000。 輸出描述: 每行輸出最簡真分數組合的個數…

csvn(apache+svn)管理工具搭建

系統環境&#xff1a;centos7.4一、服務端下載這個文件并解壓&#xff08;如果打不開&#xff0c;請下方留言&#xff09;https://pan.baidu.com/s/1miwdBc81、安裝jdk,上傳到服務器上&#xff0c;解壓[rootslave2 opt]# tar -zxvf jdk-8u91-linux-x64.gz[rootslave2 opt]# vim…

java中程序執行順序

①在java中執行順序 一 靜態初始化塊 二 非靜態初始化塊 三 構造器 四 父類構造器 ② java中的賦值順序 一 靜態初始化塊直接賦值 二 非靜態初始化塊直接賦值 三 父類繼承的屬性已賦值 四 靜態變量聲明時賦值 五 成員變量聲明時賦值 六 構造器賦值 接下來我們用一個…

編程復雜性等級劃分

摘要&#xff1a;相信開發人員一定對初級、中級、高級軟件工程師這類詞匯很熟悉吧&#xff01;你們是否對編程進行過等級劃分&#xff1f;這個又是如何劃分的呢&#xff1f;本文作者把編程復雜性從簡到難化成27個等級&#xff0c;你同意這樣的劃分嗎&#xff1f;通常來說&#…

對于抽象類的理解

這是我個人對抽象類的理解&#xff0c;為什么要有抽象類&#xff0c;因為我們在寫某個類時&#xff0c;只能寫出大概的一些屬性和共性行為&#xff0c;并不能一下子寫下所體現的具體細節&#xff0c;如我們學到的一個例子&#xff0c;我們人用打印機&#xff0c;可我們只知道打…

Spring中基于Java的配置@Configuration和@Bean用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Spring中為了減少xml中配置&#xff0c;可以聲明一個配置類&#xff08;例如SpringConfig&#xff09;來對bean進行配置。 一、首先&am…

【實數二分/前綴和維護】Best Cow Fences

Poj 2018 Best Cow Fences 實數二分前綴和維護 調了一晚上&#xff0c; 但發現沒什么注意事項orz 無輸出只因eps定義成了int型QAQ哭唧唧 #include<cstdio> #include<iostream> using namespace std; const int sz 100010; double eps 1e-5; int n, f; double a[s…

json回顯

第一種&#xff1a;用json的oData塞值 案例顯示&#xff1a; list頁面url帶值 //活動基本信息修改 function updateProject() {   var selectRow $$.getSingleSelectRow(listId, "請選擇你要操作的項目進行修改&#xff01;");   if(selectRow.activity_status&…

NoSuchElementException

在之前下項目的時候遇到這個.NoSuchElementException異常,當時我寫到一個大類的結尾。但是編譯器。從未報錯。然而在運行的時候出現了這樣的異常&#xff0c;非常頭疼 &#xff0c;一到運行時候就報異常&#xff0c;我就上網搜索了一下&#xff0c;才明白&#xff0c;這是我的剛…

東方程序員怎么看西方程序員

摘要&#xff1a;東方程序員與西方程序員&#xff0c;彼此心中是什么樣子呢&#xff1f;本文收集了東西方程序員對彼此的看法與各種印象&#xff0c;對于西方/東方程序員&#xff0c;你留有什么印象呢&#xff1f; 本文是作者根據StackExchange上的一個討論貼&#xff1a;東方程…

Android開發 - 掌握ConstraintLayout(一)傳統布局的問題

在傳統的Android開發中&#xff0c;頁面布局占用了我們很多的開發時間&#xff0c;而且面對復雜頁面的時候&#xff0c;傳統的一些布局會顯得非常復雜&#xff0c;每種布局都有特定的應用場景&#xff0c;我們通常需要各種布局結合起來使用來實現復雜的頁面。隨著ConstraintLay…

輸入流與輸出流的區別

stream結尾都是字節流&#xff0c;reader和writer結尾都是字符流兩者的區別就是讀寫的時候一個是按字節讀寫&#xff0c;一個是按字符。實際使用通常差不多。在讀寫文件需要對內容按行處理&#xff0c;比如比較特定字符&#xff0c;處理某一行數據的時候一般會選擇字符流。只是…

【Spring】Spring高級話題-@Enable***注解的工作原理

EnableAspectJAutoProxy 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 EnableAspectJAutoProxy注解 激活Aspect自動代理 <aop:aspectj-autoproxy/> 1 開啟對AspectJ自動代理的支…

IDEA項目找不到瀏覽器報錯的情況

調tomcat的時候&#xff0c;它會調用瀏覽器&#xff0c;瀏覽器關聯如果有問題&#xff0c;肯定是會報錯的 要是測試的時候&#xff0c;就是瀏覽器的問題&#xff0c;重新把瀏覽器裝一遍讓他自己重新關聯一下應該就行了轉載于:https://www.cnblogs.com/Koma-vv/p/10156478.html

c/c++經典面試試題及標準答案

下面的問題我想大部分c/c 程序員 都遇見過.如果沒有看過&#xff0c;草根IT特別推薦一下。 一、請填寫BOOL , float, 指針變量與“零值”比較的 if 語句。&#xff08;10分&#xff09;請寫出 BOOL flag 與“零值”比較的 if 語句。&#xff08;3分&#xff09;標準答案&#x…