uml類圖關係的代碼實現

繼承,接口就不舉例了;
看看其他幾種:依賴,關聯,聚合,組合;
uml類圖中這幾種關係的耦合強弱比較:依賴<關聯<聚合<組合<繼承;

依賴關係:表示一個類依賴於另一個類的定義,依賴關係總是單向的。可以簡單的理解爲,一個類A使用到了另一個類B,但是B類的變化會影響到A;比如某人要過河,需要借用一條船,此時人與船之間的關係就是依賴;表現在代碼層面,就是類B作爲參數被類A在某個method方法中使用,或者在方法體重載聲明該類的變量,或者直接引用該類;

public class Boat
{
	public void riverCrossing()
		{
			//啓動
			//過河
		}

	public static void riverCrossingByShip()
		{
			//用大船過河
		}
}

public class Person
{
	public void goCrossRiver1(Boat boat)//方法參數形式
		{
			boat.riverCrossing();
		}

	public void goCrossRiver2()//方法體中聲明類對象的形式
		{
			Boat boat=new Boat();
			boat.riverCrossing();
		}

	public void goCrossRiver3()
		{
			Boat.riverCrossingByShip();//靜態方法形式
		}
}

對於依賴關係,再看一個例子:動物依賴於水

public class Animal
{
	public Animal();
}

public class Water
{
	public Water();
}

// animal類使用water類的表現形式
表現形式1:
	Water類是全局的,則Animal類可以調用它;
表現形式2:
	Water類是Animal類的某個方法中的變量,則Animal類可以調用它;
public class Animal
{
	public void Grownup()
		{
			Water water=new Water();
			//water類的生命週期,是當Animal類的Grownup()方法被調用的時候,才被實例化
			//持有Water類的是Animal的一個方法而不是Animal類,這點是最重要的;
		}
}
表現形式3:
	public Animal
		{
			public Water Grownup(Water water)
				{
					//Water類被Animal類的一個方法持有,生命期隨着方法的執行結束而結束
				}
		}

關聯關係:
關聯關係表示類之間的關係比依賴強
舉個例子,水與氣候相關聯

public class Climate
{
	public Climate()
		{
		}
}
public class Water
{
	public Climate m_climate;
	pubic Water()
		{
		}
}

可以看到生成的代碼中,Water類的屬性中增加了Climate類
關聯分爲單向關聯和雙向關聯,上述例子就是單向關聯,而下面這個例子則是雙向關聯

Public class Water {  
    public Climate m_Climate;  
    public Water(){}  
}  
Public class Climate {  
    public Water m_Water;  
    public Climate() {}  
} 

依賴關係和關聯關係的區別在哪裏?
1.從類的屬性是否增加的角度看:
1)發生依賴關係的兩個類都不會增加屬性,其中的一個類作爲另一個類的方法的參數或者返回值,或者是某個方法的變量而已;
2)發生關聯關係的兩個類,其中的一個類成爲另一個類的屬性,而屬性是一種更爲緊密的耦合,更爲長久的關係;

2.從關係的生命期的角度看:
1)依賴關係是僅當類的方法被調用時而產生,伴隨着方法的結束而結束了;
2)關聯關係是當類實例化的時候即產生,當類銷燬的時候,關係結束。相比依賴講,關聯關係的生存期更長;

關聯關係的細化:聚合,組合
看一個例子,大雁喜歡熱鬧害怕孤獨,所以它們一直過着羣居的生活,這樣就有了雁羣,每一隻大雁都有自己的雁羣,每個雁羣都有好多隻大雁,大雁與雁羣的這種關係就可以稱之爲聚合;
每隻大雁都有兩隻翅膀,大雁與翅膀的關係就叫做組合;
可見:
聚合的關係明顯沒有組合緊密,大雁不會因爲雁羣解散而無法生存;
而翅膀就無法脫離大雁而單獨生存:組合關係的類具有相同的生命週期;

public class Wings
{
	
}

public class Goose   //組合
{
	public Wings wings;
	public Goose()
		{
			wings=new Wings();
		}
}
public class GooseGroup //聚合
{
	public Goose goose;
	public GooseGroup(Goose goose)
		{
			this.goose=goose;
		}
}

聚合和組合的不同之處:
1.構造函數不同:
聚合類的構造函數中包含了另一個類作爲參數。雁羣類(GooseGroup)的構造函數中要用到大雁(Goose)作爲參數傳遞進來,而大雁類(Goose)可以脫離雁羣而獨立存在;
組合類的構造函數中包含了另一個類的實例化。表明大雁類(Goose)在實例化之前,一定要先實例化翅膀類(Wings),這兩個類緊密的耦合在一起,同生共死;翅膀類(Wings)是不可以脫離大雁類(Goose)而獨立存在的;
2.信息封裝的不同
在聚合關係中,客戶端可以同時瞭解雁羣類和大雁類,因爲它們都是獨立的;
在組合關係中,客戶端只認識大雁類,根本就不知道翅膀類的存在,因爲翅膀類被嚴密的封裝在大雁類中;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章