1. 程式人生 > >結構型模式之橋接

結構型模式之橋接

java與模式 nes class alt print 理解 draw 構圖 circle

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驅動器的實現利用的是橋梁模式

結構型模式之橋接