橋接模式
在開始學java的時候老師講到繼承的時候荧飞,總是喜歡用一個例子來講解,那就是畫圖名党,這里有一個畫筆叹阔,可以畫正方形、長方形传睹、圓形(這個大家都知道怎么做吧耳幢,我就不解釋了)。但是現(xiàn)在我們需要給這些形狀進行上色欧啤,這里有三種顏色:白色睛藻、灰色、黑色邢隧。這里我們可以畫出3*3=9中圖形:白色正方形店印、白色長方形、白色圓形倒慧。按摘。。纫谅。炫贤。。到這里了我們幾乎到知道了這里存在兩種解決方案:
方案一:為每種形狀都提供各種顏色的版本付秕。
方案二:根據(jù)實際需要對顏色和形狀進行組合兰珍。
我們我們采用方案一來實現(xiàn)的話,我們是不是也可以這樣來理解呢询吴?為每種顏色都提供各種形狀的版本呢掠河?這個是完全的可以的。如下:
對于中兩個圖形猛计,我們都會很清楚這樣一個問題:加入我們添加橢圓口柳,我們是不是又要增加三種顏色呢?假如我們在增加一個綠色有滑,我們就要增加其四種形狀了跃闹,繼續(xù)加。繼續(xù)加……每次增加都會增加若干個類(如果增加顏色則會增加形狀個數(shù)個類毛好,若增加形狀則會增加顏色個數(shù)個類)望艺,這樣的情況我想每個程序員都不會想要吧!那么我們看方案二肌访。 方案二所提供的就是解決方法是:提供兩個父類一個是顏色找默、一個形狀,顏色父類和形狀父類兩個類都包含了相應的子類吼驶,然后根據(jù)需要對顏色和形狀進行組合惩激。
對于有幾個變化的維度店煞,我們一般采用方案二來實現(xiàn),這樣除了減少系統(tǒng)中的類個數(shù)风钻,也利于系統(tǒng)擴展顷蟀。對于方案二的應用我們稱之為橋接模式。
一骡技、 模式定義
橋接模式即將抽象部分與它的實現(xiàn)部分分離開來鸣个,使他們都可以獨立變化。
橋接模式將繼承關系轉(zhuǎn)化成關聯(lián)關系布朦,它降低了類與類之間的耦合度囤萤,減少了系統(tǒng)中類的數(shù)量,也減少了代碼量是趴。
將抽象部分與他的實現(xiàn)部分分離這句話不是很好理解涛舍,其實這并不是將抽象類與他的派生類分離,而是抽象類和它的派生類用來實現(xiàn)自己的對象唆途。這樣還是不能理解的話富雅。我們就先來認清什么是抽象化,什么是實現(xiàn)化窘哈,什么是脫耦。
抽象化:其概念是將復雜物體的一個或幾個特性抽出去而只注意其他特性的行動或過程亭敢。在面向?qū)ο缶褪菍ο蠊餐男再|(zhì)抽取出去而形成類的過程滚婉。
實現(xiàn)化:針對抽象化給出的具體實現(xiàn)。它和抽象化是一個互逆的過程帅刀,實現(xiàn)化是對抽象化事物的進一步具體化让腹。
脫耦:脫耦就是將抽象化和實現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強關聯(lián)改換成弱關聯(lián)扣溺,將兩個角色之間的繼承關系改為關聯(lián)關系骇窍。
對于那句話:將抽象部分與他的實現(xiàn)部分分離套用《大話設計模式》里面的就是實現(xiàn)系統(tǒng)可能有多個角度分類,每一種角度都可能變化锥余,那么把這種多角度分類給分離出來讓他們獨立變化腹纳,減少他們之間耦合。
橋接模式中的所謂脫耦驱犹,就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用關聯(lián)關系(組合或者聚合關系)而不是繼承關系嘲恍,從而使兩者可以相對獨立地變化,這就是橋接模式的用意雄驹。
二佃牛、 模式結(jié)構(gòu)
下圖是橋接模式的UML結(jié)構(gòu)圖:
橋接模式主要包含如下幾個角色:
Abstraction:抽象類。
RefinedAbstraction:擴充抽象類医舆。
Implementor:實現(xiàn)類接口俘侠。
ConcreteImplementor:具體實現(xiàn)類?象缀。
三、 模式實現(xiàn)
模式場景我們就采用哪個畫圖的爷速。其UML結(jié)構(gòu)圖如下:
首先是形狀類:該類為一個抽象類央星,主要提供畫形狀的方法 Shape.java :
實例
public abstract class Shape {? ? Color color;
? ? public void setColor(Color color) {? ? ? ? this.color = color;
? ? }? ?
? ? public abstract void draw();}
然后是三個形狀 。
圓形 Circle.java :
實例
public class Circle extends Shape{
? ? public void draw() {? ? ? ? color.bepaint("正方形");
? ? }
}
長方形 Rectangle.java :
實例
public class Rectangle extends Shape{
? ? public void draw() {? ? ? ? color.bepaint("長方形");
? ? }
?}
正方形 Square.java :
實例
public class Square extends Shape{
? ? public void draw() {? ? ? ? color.bepaint("正方形");
? ? }
?}
顏色接口 Color.java :
實例
public interface Color {? ? public void bepaint(String shape);}
白色 White.java :
實例
public class White implements Color{
? ? public void bepaint(String shape) {? ? ? ? System.out.println("白色的" + shape);
? ? }?
}
灰色 Gray.java :
實例
public class Gray implements Color{
? ? public void bepaint(String shape) {? ? ? ? System.out.println("灰色的" + shape);
? ? }
}
黑色 Black.java :
實例
public class Black implements Color{
? ? public void bepaint(String shape) {? ? ? ? System.out.println("黑色的" + shape);
? ? }
}
客戶端 Client.java :
實例
public class Client {? ? public static void main(String[] args) {? ? ? ? //白色? ? ? ? Color white = new White();
? ? ? ? //正方形? ? ? ? Shape square = new Square();
? ? ? ? //白色的正方形? ? ? ? square.setColor(white);
? ? ? ? square.draw();
? ? ? ? //長方形? ? ? ? Shape rectange = new Rectangle();
? ? ? ? rectange.setColor(white);
? ? ? ? rectange.draw();
? ?}
}
運行結(jié)果:
白色的正方形白色的長方形
四遍希、 模式優(yōu)缺點
優(yōu)點
1等曼、分離抽象接口及其實現(xiàn)部分。提高了比繼承更好的解決方案凿蒜。
2禁谦、橋接模式提高了系統(tǒng)的可擴充性,在兩個變化維度中任意擴展一個維度废封,都不需要修改原有系統(tǒng)州泊。
3、實現(xiàn)細節(jié)對客戶透明漂洋,可以對用戶隱藏實現(xiàn)細節(jié)遥皂。
缺點
? 1、橋接模式的引入會增加系統(tǒng)的理解與設計難度刽漂,由于聚合關聯(lián)關系建立在抽象層演训,要求開發(fā)者針對抽象進行設計與編程。
2贝咙、橋接模式要求正確識別出系統(tǒng)中兩個獨立變化的維度样悟,因此其使用范圍具有一定的局限性。
五庭猩、 模式使用場景
1窟她、如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系蔼水,通過橋接模式可以使它們在抽象層建立一個關聯(lián)關系震糖。
2、對于那些不希望使用繼承或因為多層次繼承導致系統(tǒng)類的個數(shù)急劇增加的系統(tǒng)趴腋,橋接模式尤為適用吊说。
3、一個類存在兩個獨立變化的維度优炬,且這兩個維度都需要進行擴展疏叨。
六、 模式總結(jié)
? ??? 1穿剖、橋接模式實現(xiàn)了抽象化與實現(xiàn)化的脫耦蚤蔓。他們兩個互相獨立,不會影響到對方糊余。
2秀又、對于兩個獨立變化的維度单寂,使用橋接模式再適合不過了。
3吐辙、對于"具體的抽象類"所做的改變宣决,是不會影響到客戶。
原文地址:https://www.cnblogs.com/chenssy/p/3317866.html