合成/聚合原则: 桥接模式
生活随笔
收集整理的這篇文章主要介紹了
合成/聚合原则: 桥接模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
假想場(chǎng)景:hp和apple是全球知名的電腦生產(chǎn)廠家,起初他們各自的電腦操作系統(tǒng)分別是linux和macintosh,microsoft是軟件行業(yè)的龍頭。為了吸引更多客戶購(gòu)買電腦,hp和apple請(qǐng)ms為他們開(kāi)發(fā)兩款最常用的軟件,辦公軟件和及時(shí)通訊工具。ms結(jié)了訂單后,分別為hp和apple開(kāi)發(fā)了office和msn。隨著微軟windows操作系統(tǒng)的大面積普及,hp的linux和apple的mac使用的人越來(lái)越少。最后hp和apple不得不在自己的硬件平臺(tái)上也支持windows操作系統(tǒng),同樣,他們不得不請(qǐng)ms幫助開(kāi)發(fā)windows上的office和msn。這樣,為了兼容三種操作系統(tǒng),ms開(kāi)發(fā)出了三種對(duì)應(yīng)的office和msn。隨著微軟.net技術(shù)的普遍應(yīng)用,hp和apple又不得不請(qǐng)ms為他們?cè)趙indows平臺(tái)上開(kāi)發(fā)visual studio來(lái)提升對(duì)開(kāi)發(fā)人員的吸引力。
上面的場(chǎng)景和“簡(jiǎn)單工廠、工廠方法和抽象工廠模式”那一篇非常相似,不同的地方是電腦多了一種操作系統(tǒng),軟件也相應(yīng)的多了一種。這里我們可以抽象出另外一種設(shè)計(jì)模式:橋接模式,即將抽象部分和實(shí)現(xiàn)部分分離,使他們可以獨(dú)立地變化。什么叫“抽象部分和實(shí)現(xiàn)部分分離”呢?就假想場(chǎng)景而言,就是讓電腦既可以按照操作系統(tǒng)來(lái)分類,也可以按照應(yīng)用軟件功能來(lái)分類(操作系統(tǒng)是特殊的軟件,這里把它單獨(dú)當(dāng)作區(qū)分電腦的一種分類方式)。更通俗的理解就是“實(shí)現(xiàn)系統(tǒng)可能又多種角度分類,每一種分類都可能變化,把這種多角度分離出來(lái)讓他們獨(dú)立變化,減少他們之間的耦合”。Code is cheap。看代碼了:
Code
using?System;
/*?按照軟件功能分類?*/
///?<summary>
///?應(yīng)用程序抽象類
///?</summary>
abstract?class?Application
{
????public?abstract?void?Run();
}
/*office,msn,vs具體類*/
class?Office?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?Office");
????}
}
class?Msn?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?Msn");
????}
}
class?VisualStudio?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?VS");
????}
}
/*?按照操作系統(tǒng)分類?*/
abstract?class?Os
{
????protected?Application?software;
????public?void?SetApplication(Application?app)//電腦需要安裝應(yīng)用程序
????{
????????this.software?=?app;
????}
????public?abstract?void?Run();?//電腦運(yùn)行
}
/*windows,linuxs,mac具體類*/
class?MsWindows?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
}
class?HpLinux?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
}
class?AppleMac?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
///?<summary>
///?客戶端調(diào)用
///?</summary>
????static?void?Main(string[]?args)
????{
????????Os?myOs;
????????myOs?=?new?MsWindows();
????????myOs.SetApplication(new?Office());?//安裝office
????????myOs.Run();
????????myOs.SetApplication(new?Msn());?//安裝msn
????????myOs.Run();
????????myOs.SetApplication(new?VisualStudio());?//安裝vs
????????myOs.Run();
????????Console.Read();
????}
}上面的代碼是一種松耦合的程序,它遵循了合成/聚合復(fù)用原則。所謂合成,是一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的整體與部分的關(guān)系,部分和整體的生命周期一樣;所謂聚合,是一種弱的“擁有”關(guān)系,體現(xiàn)的是a對(duì)象可以包含b對(duì)象,但b對(duì)象不是a對(duì)象的一部分。舉例來(lái)說(shuō),翅膀和大雁是部分與整體的關(guān)系,且它們的生命周期相同,是合成關(guān)系;而大雁和雁群是聚合關(guān)系,因?yàn)槊恐淮笱愣际菍儆谝粋€(gè)雁群,一個(gè)雁群可以又多只大雁。相應(yīng)的,我們的代碼部分,應(yīng)用程序application和操作系統(tǒng)os就是聚合關(guān)系。
合成/聚合復(fù)用原則的好處是:”有助于保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)中,這樣類和類的繼承層次會(huì)保持較小規(guī)模,并且不太可能增長(zhǎng)為不可控制的龐然大物。“
上面的場(chǎng)景和“簡(jiǎn)單工廠、工廠方法和抽象工廠模式”那一篇非常相似,不同的地方是電腦多了一種操作系統(tǒng),軟件也相應(yīng)的多了一種。這里我們可以抽象出另外一種設(shè)計(jì)模式:橋接模式,即將抽象部分和實(shí)現(xiàn)部分分離,使他們可以獨(dú)立地變化。什么叫“抽象部分和實(shí)現(xiàn)部分分離”呢?就假想場(chǎng)景而言,就是讓電腦既可以按照操作系統(tǒng)來(lái)分類,也可以按照應(yīng)用軟件功能來(lái)分類(操作系統(tǒng)是特殊的軟件,這里把它單獨(dú)當(dāng)作區(qū)分電腦的一種分類方式)。更通俗的理解就是“實(shí)現(xiàn)系統(tǒng)可能又多種角度分類,每一種分類都可能變化,把這種多角度分離出來(lái)讓他們獨(dú)立變化,減少他們之間的耦合”。Code is cheap。看代碼了:
Code
using?System;
/*?按照軟件功能分類?*/
///?<summary>
///?應(yīng)用程序抽象類
///?</summary>
abstract?class?Application
{
????public?abstract?void?Run();
}
/*office,msn,vs具體類*/
class?Office?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?Office");
????}
}
class?Msn?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?Msn");
????}
}
class?VisualStudio?:?Application
{
????public?override?void?Run()
????{
????????Console.Write("Run?VS");
????}
}
/*?按照操作系統(tǒng)分類?*/
abstract?class?Os
{
????protected?Application?software;
????public?void?SetApplication(Application?app)//電腦需要安裝應(yīng)用程序
????{
????????this.software?=?app;
????}
????public?abstract?void?Run();?//電腦運(yùn)行
}
/*windows,linuxs,mac具體類*/
class?MsWindows?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
}
class?HpLinux?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
}
class?AppleMac?:?Os
{
????public?override?void?Run()
????{
????????software.Run();
????}
///?<summary>
///?客戶端調(diào)用
///?</summary>
????static?void?Main(string[]?args)
????{
????????Os?myOs;
????????myOs?=?new?MsWindows();
????????myOs.SetApplication(new?Office());?//安裝office
????????myOs.Run();
????????myOs.SetApplication(new?Msn());?//安裝msn
????????myOs.Run();
????????myOs.SetApplication(new?VisualStudio());?//安裝vs
????????myOs.Run();
????????Console.Read();
????}
}上面的代碼是一種松耦合的程序,它遵循了合成/聚合復(fù)用原則。所謂合成,是一種強(qiáng)的“擁有”關(guān)系,體現(xiàn)了嚴(yán)格的整體與部分的關(guān)系,部分和整體的生命周期一樣;所謂聚合,是一種弱的“擁有”關(guān)系,體現(xiàn)的是a對(duì)象可以包含b對(duì)象,但b對(duì)象不是a對(duì)象的一部分。舉例來(lái)說(shuō),翅膀和大雁是部分與整體的關(guān)系,且它們的生命周期相同,是合成關(guān)系;而大雁和雁群是聚合關(guān)系,因?yàn)槊恐淮笱愣际菍儆谝粋€(gè)雁群,一個(gè)雁群可以又多只大雁。相應(yīng)的,我們的代碼部分,應(yīng)用程序application和操作系統(tǒng)os就是聚合關(guān)系。
合成/聚合復(fù)用原則的好處是:”有助于保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)中,這樣類和類的繼承層次會(huì)保持較小規(guī)模,并且不太可能增長(zhǎng)為不可控制的龐然大物。“
轉(zhuǎn)載于:https://www.cnblogs.com/jeffwongishandsome/archive/2009/04/13/1411737.html
總結(jié)
以上是生活随笔為你收集整理的合成/聚合原则: 桥接模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 奔驰车钥匙多少钱啊?
- 下一篇: 太原割包皮多少钱啊?