結構型模式之橋接
GOF對橋接模式(Bridge)的定義是:將抽象部分和它的實現部分分離,使它們可以獨立地變化。這裏需要記錄一些概念,參考自《Java與模式》一書:
抽象化:存在於多個實體中的共同的概念性聯系,例如:一組對象如果有相同的概念性聯系,則可以用一個共同的類加以描述;如果一些類有相同的概念性聯系,則可以用一個抽象類加以描述。
實現化:就是給出抽象化的具體實現,例如:一個對象是一個類的實現化;一個具體類可以是一個抽象類的實現化。
脫耦:耦合是兩個實體具有某種強關聯關系,將這種強關聯關系去掉就是解耦的過程。所謂強關聯是在編譯時期就已經確定好了關系,例如:繼承就是一種強關聯關系;而弱關聯關系則是在運行期間可以動態地改變關聯狀態,類的組合關系就是一種若關聯關系,這在Java編程中是最常用的一種關系。
理解GOF所下定義的關鍵是搞明白“抽象” 和“實現”的含義,這裏的抽象說白了就是指一個類及其子類,而“實現”是抽象類及其子類實現自己所用的對象,這句話用漢語說比較困難,請看《Design Patterns Explained》作者的表述:Implementations here means the objects that the abstract class and its derivations use to implement themselves with,這就是“實現” 的含義。比如:有一個圖形的抽象類Shape,Shape有相應的子類,比如Rectange類,要實現一個Rectange對象,當然需要Draw方法,如果將Draw方法定義到Shape類中,那麽每個繼承自Shape類的子類都要自定義自己的Draw()方法,豈不是很麻煩,但是,如果將Draw()方法提煉出來單獨放到一個類中(也就是Implementor)中,然後讓Shape子類去調用對應的Draw()方法豈不是更妙,這樣添加Shape子類就不用再在自己的類中添加Draw()方法了,而是調用相應的ConcreteImplementor中的Draw()方法,下面第一個圖是Bridge模式的結構圖,第二個圖是《Design Patterns Explained》一書中所舉畫圖例子的Bridge模式設計圖
圖1. Bridge模式結構圖
圖2. Bridge模式畫圖設計圖
畫圖舉例代碼如下:
abstract class Shape{ private Drawing drawing; public Shape(Drawing drawing){ this.drawing=drawing; } public void Draw(){ drawing.drawLine(); } } class Rectange extends Shape{ public Rectange(Drawing drawing){ super(drawing); } } abstract class Drawing{ public void drawLine(){}; public void drawCircle(){}; } class V1Drawing extends Drawing{ public void drawLine(){ System.out.println("Drawing Lines"); } public void drawCircle(){ System.out.println("Drawing Circles"); } }
《Java與模式》一書還舉例一個應用的例子,就是JDBC驅動器的實現利用的是橋梁模式
結構型模式之橋接