22桥接模式(Bridge Pattern)
動(dòng)機(jī)(Motivate):
????在軟件系統(tǒng)中,某些類型由于自身的邏輯,它具有兩個(gè)或多個(gè)維度的變化,那么如何應(yīng)對(duì)這種“多維度的變化”?如何利用面向?qū)ο蟮募夹g(shù)來(lái)使得該類型能夠輕松的沿著多個(gè)方向進(jìn)行變化,而又不引入額外的復(fù)雜度?
意圖(Intent):
????將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。
??? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ------《設(shè)計(jì)模式》GOF
結(jié)構(gòu)圖(Struct):
??? ?? ????????????
生活中的例子:? ????
??? 我想大家小時(shí)候都有用蠟筆畫(huà)畫(huà)的經(jīng)歷吧。紅紅綠綠的蠟筆一大盒,根據(jù)想象描繪出格式圖樣。而毛筆下的國(guó)畫(huà)更是工筆寫(xiě)意,各展風(fēng)采。而今天我們的故事從蠟筆與毛筆說(shuō)起。
??? 設(shè) 想要繪制一幅圖畫(huà),藍(lán)天、白云、綠樹(shù)、小鳥(niǎo),如果畫(huà)面尺寸很大,那么用蠟筆繪制就會(huì)遇到點(diǎn)麻煩。畢竟細(xì)細(xì)的蠟筆要涂出一片藍(lán)天,是有些麻煩。如果有可能, 最好有套大號(hào)蠟筆,粗粗的蠟筆很快能涂抹完成。至于色彩嗎,最好每種顏色來(lái)支粗的,除了藍(lán)天還有綠地呢。這樣,如果一套12種顏色的蠟筆,我們需要兩套 24支,同種顏色的一粗一細(xì)。呵呵,畫(huà)還沒(méi)畫(huà),開(kāi)始做夢(mèng)了:要是再有一套中號(hào)蠟筆就更好了,這樣,不多不少總共36支蠟筆。
?
??? ? ? ???
?? 再看看毛筆這一邊,居然如此簡(jiǎn)陋:一套水彩12色,外加大中小三支毛筆。你可別小瞧這"簡(jiǎn)陋"的組合,畫(huà)藍(lán)天用大毛筆,畫(huà)小鳥(niǎo)用小毛筆,各具特色。
?
??? ?? ???
?? ??? 呵呵,您是不是已經(jīng)看出來(lái)了,不錯(cuò),我今天要說(shuō)的就是Bridge模式。為了一幅畫(huà),我們需要準(zhǔn)備36支型號(hào)不同的蠟筆,而改用毛筆三支就夠了,當(dāng) 然還要搭配上12種顏料。通過(guò)Bridge模式,我們把乘法運(yùn)算3×12=36改為了加法運(yùn)算3+12=15,這一改進(jìn)可不小。那么我們這里蠟筆和毛筆到 底有什么區(qū)別呢?
??? 實(shí)際上,蠟筆和毛筆的關(guān)鍵一個(gè)區(qū)別就在于筆和顏色是否能夠分離?!綠OF95】橋梁模式的用意是"將抽象化 (Abstraction)與實(shí)現(xiàn)化(Implementation)脫耦,使得二者可以獨(dú)立地變化"。關(guān)鍵就在于能否脫耦。蠟筆的顏色和蠟筆本身是分不 開(kāi)的,所以就造成必須使用36支色彩、大小各異的蠟筆來(lái)繪制圖畫(huà)。而毛筆與顏料能夠很好的脫耦,各自獨(dú)立變化,便簡(jiǎn)化了操作。在這里,抽象層面的概念是: "毛筆用顏料作畫(huà)",而在實(shí)現(xiàn)時(shí),毛筆有大中小三號(hào),顏料有紅綠藍(lán)等12種,于是便可出現(xiàn)3×12種組合。每個(gè)參與者(毛筆與顏料)都可以在自己的自由度 上隨意轉(zhuǎn)換。
??? 蠟筆由于無(wú)法將筆與顏色分離,造成筆與顏色兩個(gè)自由度無(wú)法單獨(dú)變化,使得只有創(chuàng)建36種對(duì)象才能完成任務(wù)。Bridge模式將繼承關(guān)系轉(zhuǎn)換為組合關(guān)系,從而降低了系統(tǒng)間的耦合,減少了代碼編寫(xiě)量。??
代碼實(shí)現(xiàn):?
????
2?????{
3?????????protected?Color?c;
4?????????public?abstract?void?Paint();
5?
6?????????public?void?SetColor(Color?c)
7?????????{?this.c?=?c;?}
8?????}
?
2?????{
3?????????public?override?void?Paint()
4?????????{?Console.WriteLine("Using?big?brush?and?color?{0}?painting",?c.color);?}
5?????}
?
1???class?SmallBrush?:?Brush2?????{
3?????????public?override?void?Paint()
4?????????{?Console.WriteLine("Using?small?brush?and?color?{0}?painting",?c.color);?}
5?????}
?
1???class?Color2?????{
3?????????public?string?color;
4?????}
?
1?class?Red?:?Color2?????{
3?????????public?Red()
4?????????{?this.color?=?"red";?}
5?????}
?
1????class?Green?:?Color2?????{
3?????????public?Green()
4?????????{?this.color?=?"green";?}
5?????}
?
1???class?Blue?:?Color2?????{
3?????????public?Blue()
4?????????{?this.color?=?"blue";?}
5?????}
?
?1?????class?Program?2?????{
?3????public?static?void?Main()
?4???{
?5?????Brush?b?=?new?BigBrush();
?6?????b.SetColor(new?Red());
?7?????b.Paint();
?8?????b.SetColor(new?Blue());
?9?????b.Paint();
10?????b.SetColor(new?Green());
11?????b.Paint();
12?
13?????b?=?new?SmallBrush();
14?????b.SetColor(new?Red());
15?????b.Paint();
16?????b.SetColor(new?Blue());
17?????b.Paint();
18?????b.SetColor(new?Green());
19?????b.Paint();
20???}
適用性:???
???1.如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。
??? ? 2.設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端,或者說(shuō)實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的。
??? ? 3?.一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合。
?? ?? 4?.雖然在系統(tǒng)中使用繼承是沒(méi)有問(wèn)題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。
Bridge要點(diǎn):???
?????1.Bridge模式使用“對(duì)象間的組合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來(lái)變化。
??? ??? 2.所謂抽象和實(shí)現(xiàn)沿著各自維度的變化,即“子類化”它們,得到各個(gè)子類之后,便可以任意它們,從而獲得不同平臺(tái)上的不同型號(hào)。
??? ??? 3.Bridge模式有時(shí)候類似于多繼承方案,但是多繼承方案往往違背了類的單一職責(zé)原則(即一個(gè)類只有一個(gè)變化的原因),復(fù)用性比較差。Bridge模式是比多繼承方案更好的解決方法。
??? ??? 4.Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)候即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不劇烈——換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并不一定要使用Bridge模式。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的22桥接模式(Bridge Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浦发梦卡之斗鱼联名卡年费是多少
- 下一篇: GetType和typeof的区别