依賴關(guān)系:
創(chuàng)新互聯(lián)專注于方山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供方山營銷型網(wǎng)站建設(shè),方山網(wǎng)站制作、方山網(wǎng)頁設(shè)計、方山網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造方山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供方山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
類A依賴類B的意思是,如果A的對象要完成某一操作,必須使用B的對象的某些操作來幫忙,才能完成。簡言之,B作為A的某個方法的方法參數(shù)存在。如下:
class A{
public void f(B b){
}
}
Class B{
}
//A為一個圓柱體類,要求A實例的體積
public class A{
public static void main (String[] args){
double zArea=0;
B b=new B(); //底面積及為一個圓(B類)的面積
double height = 1.6;
//調(diào)用B類實例的getArea()方法,形成依賴關(guān)系
zArea=b.getArea(4)*height; //半徑r=4,高height=1.6
}
}
//圓類B
class B{
public double getArea(int r){
double area=0;
area=3.14159*r*r;
return area;
}
}
1、依賴關(guān)系,uml圖示為虛線加箭頭 A------B, 是一種使用的關(guān)系, 即一個類的實現(xiàn)需要另一個類的協(xié)助。比用常常寫的工具類就是可以被 其他類使用的
代碼示例: 為訂單生成訂單號碼的服務(wù)類,使用Math類產(chǎn)生隨機數(shù)
這個時候 OrderService類依賴Math類
OrderService ------ Math
public class OrderService{
public String getOrderNum(){
return Math.random()*1000+"";
}
}
2、關(guān)聯(lián)關(guān)系,分為聚合、組合、及一般關(guān)聯(lián) 。
組合關(guān)系 A◆———B 部分和整體之間具有相同的生命周期,當(dāng)整體消亡后,部分也將消亡。舉例 人體結(jié)構(gòu)中 人體和大腦之間是一種組合關(guān)系, 人體亡了大腦也會死 例子有點沉重哈,但是好理解
代碼示例
Body ◆———Brain
public class Body{
private Brain brain;
public Body(){
this.brain = new Brain();
}
public void think(){
brain.think();
}
}
聚合關(guān)系 A◇———B 部分與整體之間并沒有相同的生命周期,整體消亡后部分可以獨立存在。 比如汽車和輪胎, 汽車銷毀了 輪胎可以作為配件 運用到其他汽車上,所以是一種聚合關(guān)系。
代碼示例:
Car ◆———Tyre
public class Car{
private Tyre tyre;
public Car(Tyre tyre){
this.tyre= tyre;
}
public void run(){
tyre.run();
}
}
一般關(guān)聯(lián):是一種結(jié)構(gòu)化的關(guān)系,指一種對象和另一種對象有聯(lián)系,給定關(guān)聯(lián)的兩個類,可以從其中的一個類的對象訪問到另一個類的相關(guān)對象。
解釋上很拗口 不如組合 聚合來的清晰明了。可以和依賴關(guān)系作個對比,依賴實際上就是 主類依賴其他類的方法 完成部分邏輯,比如工具類的調(diào)用等, 但是兩個類之間沒有任何聯(lián)系。 而關(guān)聯(lián)關(guān)系 是存在某種聯(lián)系的 比如學(xué)校和老師,老師和學(xué)生,學(xué)生和課本 等等, 兩個對象之間是存在某種聯(lián)系的。
java示例:
Student ———— Teacher
public class Student{
private Teacher englishTeacher;
public String myEnglishTeacherName(){
return englishTeacher.getName();
}
}
上面的關(guān)聯(lián)關(guān)系,只是描述了 對象和對象之間的聯(lián)系,并沒有指明關(guān)聯(lián)的數(shù)量。 比如一個學(xué)生是關(guān)聯(lián)多個老師的(語文老師、數(shù)學(xué)老師 etc) ,那么這種關(guān)聯(lián)是一種1對多的關(guān)聯(lián) 等等,先理解基本的然后再深入比較好
從類的代碼表達來看, 關(guān)聯(lián)關(guān)系(組合、聚合、一般關(guān)聯(lián)關(guān)系) 都是一個類作為另一個類的成員變量來表示, 依賴關(guān)系大部分是 一個類作為另一個類的方法參數(shù),或者直接調(diào)用被依賴類的靜態(tài)方法, 或者直接實例化被依賴類然后調(diào)用其方法 等。
理解好了 依賴和關(guān)聯(lián) 包括集成 實現(xiàn) 等關(guān)系及 UML圖示后, 對于 代碼的設(shè)計將會有很大幫助
措施一:改寫類的實例方法
通過類繼承實現(xiàn)代碼重用不是精確的代碼重用技術(shù),因此它并不是最理想的代碼重用機制。換句話說,如果不繼承整個類的所有方法和數(shù)據(jù)成員,我們無法重用該類里面的單個方法。繼承總是帶來一些多余的方法和數(shù)據(jù)成員,它們總是使得重用類里面某個方法的代碼復(fù)雜化。另外,派生類對父類的依賴關(guān)系也使得代碼進一步復(fù)雜化:對父類的改動可能影響子類;修改父類或者子類中的任意一個類時,我們很難記得哪一個方法被子類覆蓋、哪一個方法沒有被子類覆蓋;最后,子類中的覆蓋方法是否要調(diào)用父類中的對應(yīng)方法有時并不顯而易見。
任何方法,只要它執(zhí)行的是某個單一概念的任務(wù),就其本身而言,它就應(yīng)該是首選的可重用代碼。為了重用這種代碼,我們必須回歸到面向過程的編程模式,把類的實例方法移出成為全局性的過程。為了提高這種過程的可重用性,過程代碼應(yīng)該象靜態(tài)工具方法一樣編寫:它只能使用自己的輸入?yún)?shù),只能調(diào)用其他全局性的過程,不能使用任何非局部的變量。這種對外部依賴關(guān)系的限制簡化了過程的應(yīng)用,使得過程能夠方便地用于任何地方。當(dāng)然,由于這種組織方式總是使得代碼具有更清晰的結(jié)構(gòu),即使是不考慮重用性的代碼也同樣能夠從中獲益。
//依賴最常見的是參數(shù)關(guān)系,如:
public class B{
/***B中的一個方法**/
public void testMethod(A a){
//此時B和A是依賴關(guān)系
}
}
//聚合關(guān)系通常表現(xiàn)為部分與整體的關(guān)系,如:
public class B{
/***B中的一個屬性**/
A a;
}
//泛化關(guān)系通常表現(xiàn)為繼承關(guān)系,如:
public class B extends A{
}
這個好寫,People類中有幾個屬性,姓名,年齡,等 還有比如說人所使用的交通工具,那就得依賴Car類,繼承其全部的屬性和方法,人也得有住處的吧,那就有House類,繼承House類的全部屬性和方法,如果有人想問一個人你開的什么樣的車,車的配置是什么的,這樣就一目了然了,還有住房也是同樣的道理,寫三個類,然后在Person類中extends House,Car