橋接模式
概述:將抽象部分與他的實現部分分離,這樣抽象化與實現化解耦,使他們可以獨立的變化.如何實現解耦的呢,就是通過提供抽象化和實現化之間的橋接結構.
應用場景
實現系統可能有多個角度分類,每一種角度都可能變化.
解釋:橋接模式將繼承模式轉化成關聯關係,他降低了類與類之間的耦合度,減少了系統中類的數量,也減少了代碼量.理解抽象化,實現化,解耦
抽象化:將複雜物體的一個或幾個共同的特性抽出去而只注意其他特性的行動或過程.在java面向對象中抽象化就是將對象的共同性質抽取出去形成類的過程.
實現化:針對抽象化給出的具體實現,它和抽象化是一個互逆的過程,實現化是對抽象化事物的進一步具體化.
解耦:解耦是將抽象化和實現化之間的耦合關係解脫開,或者說是將他們之間的強關聯改換成弱關聯.將兩個角色之間的繼承關係修改爲關聯關係.
模式實現
代碼:
/**
* 圖形事物
*/
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
/**
* 圖形實現類:正方形
*/
class Circle extends Shape {
public void draw() {
color.bepaint("正方形");
}
}
/**
* 圖形實現類:長方形
*/
class Rectangle extends Shape {
public void draw() {
color.bepaint("長方形");
}
}
/**
* 圖形實現類:正方形
*/
class Square extends Shape {
public void draw() {
color.bepaint("正方形");
}
}
/**
* 圖形事物的特性類----抽象化 接口
*/
public interface Color {
void bepaint(String shape);
}
/**
* 實現化:實現類
*/
class White implements Color {
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
/**
* 實現化:實現類
*/
class Gray implements Color {
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
/**
* 實現化:實現類
*/
class Black implements Color {
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
模式優缺點
優點
1、分離抽象接口及其實現部分。提高了比繼承更好的解決方案。
2、橋接模式提高了系統的可擴充性,在兩個變化維度中任意擴展一個維度,都不需要修改原有系統。
3、實現細節對客戶透明,可以對用戶隱藏實現細節。
缺點
1、橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與編程。
2、橋接模式要求正確識別出系統中兩個獨立變化的維度,因此其使用範圍具有一定的侷限性。
模式使用場景
1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯繫,通過橋接模式可以使它們在抽象層建立一個關聯關係。
2、對於那些不希望使用繼承或因爲多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤爲適用。
3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
模式總結
1、橋接模式實現了抽象化與實現化的脫耦。他們兩個互相獨立,不會影響到對方。
2、對於兩個獨立變化的維度,使用橋接模式再適合不過了。
3、對於“具體的抽象類”所做的改變,是不會影響到客戶。