合成/聚合原则: 桥接模式
生活随笔
收集整理的這篇文章主要介紹了
合成/聚合原则: 桥接模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假想場景:hp和apple是全球知名的電腦生產廠家,起初他們各自的電腦操作系統分別是linux和macintosh,microsoft是軟件行業的龍頭。為了吸引更多客戶購買電腦,hp和apple請ms為他們開發兩款最常用的軟件,辦公軟件和及時通訊工具。ms結了訂單后,分別為hp和apple開發了office和msn。隨著微軟windows操作系統的大面積普及,hp的linux和apple的mac使用的人越來越少。最后hp和apple不得不在自己的硬件平臺上也支持windows操作系統,同樣,他們不得不請ms幫助開發windows上的office和msn。這樣,為了兼容三種操作系統,ms開發出了三種對應的office和msn。隨著微軟.net技術的普遍應用,hp和apple又不得不請ms為他們在windows平臺上開發visual studio來提升對開發人員的吸引力。
上面的場景和“簡單工廠、工廠方法和抽象工廠模式”那一篇非常相似,不同的地方是電腦多了一種操作系統,軟件也相應的多了一種。這里我們可以抽象出另外一種設計模式:橋接模式,即將抽象部分和實現部分分離,使他們可以獨立地變化。什么叫“抽象部分和實現部分分離”呢?就假想場景而言,就是讓電腦既可以按照操作系統來分類,也可以按照應用軟件功能來分類(操作系統是特殊的軟件,這里把它單獨當作區分電腦的一種分類方式)。更通俗的理解就是“實現系統可能又多種角度分類,每一種分類都可能變化,把這種多角度分離出來讓他們獨立變化,減少他們之間的耦合”。Code is cheap??创a了:
Code
using?System;
/*?按照軟件功能分類?*/
///?<summary>
///?應用程序抽象類
///?</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");
????}
}
/*?按照操作系統分類?*/
abstract?class?Os
{
????protected?Application?software;
????public?void?SetApplication(Application?app)//電腦需要安裝應用程序
????{
????????this.software?=?app;
????}
????public?abstract?void?Run();?//電腦運行
}
/*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>
///?客戶端調用
///?</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();
????}
}上面的代碼是一種松耦合的程序,它遵循了合成/聚合復用原則。所謂合成,是一種強的“擁有”關系,體現了嚴格的整體與部分的關系,部分和整體的生命周期一樣;所謂聚合,是一種弱的“擁有”關系,體現的是a對象可以包含b對象,但b對象不是a對象的一部分。舉例來說,翅膀和大雁是部分與整體的關系,且它們的生命周期相同,是合成關系;而大雁和雁群是聚合關系,因為每只大雁都是屬于一個雁群,一個雁群可以又多只大雁。相應的,我們的代碼部分,應用程序application和操作系統os就是聚合關系。
合成/聚合復用原則的好處是:”有助于保持每個類被封裝,并被集中在單個任務中,這樣類和類的繼承層次會保持較小規模,并且不太可能增長為不可控制的龐然大物?!?
上面的場景和“簡單工廠、工廠方法和抽象工廠模式”那一篇非常相似,不同的地方是電腦多了一種操作系統,軟件也相應的多了一種。這里我們可以抽象出另外一種設計模式:橋接模式,即將抽象部分和實現部分分離,使他們可以獨立地變化。什么叫“抽象部分和實現部分分離”呢?就假想場景而言,就是讓電腦既可以按照操作系統來分類,也可以按照應用軟件功能來分類(操作系統是特殊的軟件,這里把它單獨當作區分電腦的一種分類方式)。更通俗的理解就是“實現系統可能又多種角度分類,每一種分類都可能變化,把這種多角度分離出來讓他們獨立變化,減少他們之間的耦合”。Code is cheap??创a了:
Code
using?System;
/*?按照軟件功能分類?*/
///?<summary>
///?應用程序抽象類
///?</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");
????}
}
/*?按照操作系統分類?*/
abstract?class?Os
{
????protected?Application?software;
????public?void?SetApplication(Application?app)//電腦需要安裝應用程序
????{
????????this.software?=?app;
????}
????public?abstract?void?Run();?//電腦運行
}
/*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>
///?客戶端調用
///?</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();
????}
}上面的代碼是一種松耦合的程序,它遵循了合成/聚合復用原則。所謂合成,是一種強的“擁有”關系,體現了嚴格的整體與部分的關系,部分和整體的生命周期一樣;所謂聚合,是一種弱的“擁有”關系,體現的是a對象可以包含b對象,但b對象不是a對象的一部分。舉例來說,翅膀和大雁是部分與整體的關系,且它們的生命周期相同,是合成關系;而大雁和雁群是聚合關系,因為每只大雁都是屬于一個雁群,一個雁群可以又多只大雁。相應的,我們的代碼部分,應用程序application和操作系統os就是聚合關系。
合成/聚合復用原則的好處是:”有助于保持每個類被封裝,并被集中在單個任務中,這樣類和類的繼承層次會保持較小規模,并且不太可能增長為不可控制的龐然大物?!?
轉載于:https://www.cnblogs.com/jeffwongishandsome/archive/2009/04/13/1411737.html
總結
以上是生活随笔為你收集整理的合成/聚合原则: 桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奔驰车钥匙多少钱啊?
- 下一篇: java做的一个将中文转换成Unicod