橋接模式
將抽象部份與它的實現部份分離,使它們都可獨立地變化。
橋接模式是最復雜的模式之一,它把事物對象和其具體行為、具體特征分離開來,使它們可以各自獨立的變化。事物對象僅是一個抽象的概念。如“圓形”、“三角形”歸于抽象的“形狀”之下,而“畫圓”、“畫三角”歸于實現行為的“畫圖”類之下,然后由“形狀”調用“畫圖”。
橋接模式的組成部份:
1.抽象對象
2.對象實現
3.細化抽象
4.細化對象實現
橋接模式各組成部份之間的關系:

例子
1.抽象對象
package bridge;


/** *//**
* <ul>
* <li>Title:[Shape]</li>
* <li>Description: [圖形接口]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public interface Shape


{

/** *//**
* <ul>
* <li>Description:[畫法]</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public void draw();

/** *//**
* <ul>
* <li>Description:[百分比放縮]</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @param pct
*/
public void resizeByPercentage(double pct);
}

2.抽象對象實現
package bridge;


/** *//**
* <ul>
* <li>Title:[CircleShape]</li>
* <li>Description: [圓圖形]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @version 1.0
*/
public class CircleShape implements Shape


{

/** *//** 圖形位置X */
private double x;

/** *//** 圖形位置Y */
private double y;

/** *//** 圖形單徑 */
private double radius;

/** *//** 畫接口 */
private DrawAPI drawAPI;

/** *//**
* <ul>
* <li>Description:[構造方法]</li>
* <ul>
*
* @param x
* @param y
* @param radius
* @param drawAPI
*/
public CircleShape(double x, double y, double radius, DrawAPI drawAPI)

{
this.x = x;
this.y = y;
this.radius = radius;
this.drawAPI = drawAPI;
}

/** *//**
* <ul>
* <li>Description:[畫圖]</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*/
public void draw()

{
drawAPI.drawCircle(x, y, radius);
}

/** *//**
* <ul>
* <li>Description:[百分比放縮]</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
*
* @param pct
*/
public void resizeByPercentage(double pct)

{
radius *= pct;
}
}

3.細化抽象
package bridge;


/** *//**
* <ul>
* <li>Title:[DrawAPI]</li>
* <li>Description: [畫圖API]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public interface DrawAPI


{

/** *//**
* <ul>
* <li>Description:[畫圓]</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @param x
* @param y
* @param radius
*/
public void drawCircle(double x, double y, double radius);
}

4.細化抽象實例
1).
package bridge;


/** *//**
* <ul>
* <li>Title:[ConcretDrawA]</li>
* <li>Description: [具體畫法]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class ConcretDrawA implements DrawAPI


{

/**//* (non-Javadoc)
* @see bridge.DrawAPI#drawCircle(double, double, double)
*/
public void drawCircle(double x, double y, double radius)

{
System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
}
}

2).
package bridge;


/** *//**
* <ul>
* <li>Title:[ConcretDrawB]</li>
* <li>Description: [具體畫法2]</li>
* <li>Copyright 2009 Upengs Co., Ltd.</li>
* <li>All right reserved.</li>
* <li>Created by [Huyvanpull] [2011-8-3]</li>
* <li>Midified by [modifier] [modified time]</li>
* </ul>
* @version 1.0
*/
public class ConcretDrawB implements DrawAPI


{

/**//* (non-Javadoc)
* @see bridge.DrawAPI#drawCircle(double, double, double)
*/
public void drawCircle(double x, double y, double radius)

{
System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
}
}

5.測試
package bridge;

public class Test


{
public static void main(String[] args)

{
Shape[] shapes = new Shape[2];
shapes[0] = new CircleShape(1, 2, 3, new ConcretDrawA());
shapes[1] = new CircleShape(5, 7, 11, new ConcretDrawB());
for (Shape shape : shapes)

{
shape.resizeByPercentage(2.5);
shape.draw();
}
}
}

效果:
1.Bridge模式使用“對象間的組合關系”解耦了抽象和實現之間固有的綁定關系,使得抽象和實現可以沿著各自的維度來變化。
2.所謂抽象和實現沿著各自維度的變化,即“子類化”它們,得到各個子類之后,便可以任意它們,從而獲得不同平臺上的不同型號。
3.Bridge模式有時候類似于多繼承方案,但是多繼承方案往往違背了類的單一職責原則(即一個類只有一個變化的原因),復用性比較差。Bridge模式是比多繼承方案更好的解決方法。
4.Bridge模式的應用一般在“兩個非常強的變化維度”,有時候即使有兩個變化的維度,但是某個方向的變化維度并不劇烈——換言之兩個變化不會導致縱橫交錯的結果,并不一定要使用Bridge模式。
適用性:
1.如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的聯系。
2.設計要求實現化角色的任何改變不應當影響客戶端,或者說實現化角色的改變對客戶端是完全透明的。
3.一個構件有多于一個的抽象化角色和實現化角色,系統需要它們之間進行動態耦合。
4.雖然在系統中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨立變化,設計要求需要獨立管理這兩者。
總結
Bridge模式是一個非常有用的模式,也非常復雜,它很好的符合了開放-封閉原則和優先使用對象,而不是繼承這兩個面向對象原則。