橋接模式
將抽象部份與它的實(shí)現(xiàn)部份分離,使它們都可獨(dú)立地變化。
橋接模式是最復(fù)雜的模式之一,它把事物對(duì)象和其具體行為、具體特征分離開來(lái),使它們可以各自獨(dú)立的變化。事物對(duì)象僅是一個(gè)抽象的概念。如“圓形”、“三角形”歸于抽象的“形狀”之下,而“畫圓”、“畫三角”歸于實(shí)現(xiàn)行為的“畫圖”類之下,然后由“形狀”調(diào)用“畫圖”。
橋接模式的組成部份:
1.抽象對(duì)象
2.對(duì)象實(shí)現(xiàn)
3.細(xì)化抽象
4.細(xì)化對(duì)象實(shí)現(xiàn)
橋接模式各組成部份之間的關(guān)系:

例子
1.抽象對(duì)象
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.抽象對(duì)象實(shí)現(xiàn)
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:[構(gòu)造方法]</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.細(xì)化抽象
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.細(xì)化抽象實(shí)例
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.測(cè)試
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模式使用“對(duì)象間的組合關(guān)系”解耦了抽象和實(shí)現(xiàn)之間固有的綁定關(guān)系,使得抽象和實(shí)現(xiàn)可以沿著各自的維度來(lái)變化。
2.所謂抽象和實(shí)現(xiàn)沿著各自維度的變化,即“子類化”它們,得到各個(gè)子類之后,便可以任意它們,從而獲得不同平臺(tái)上的不同型號(hào)。
3.Bridge模式有時(shí)候類似于多繼承方案,但是多繼承方案往往違背了類的單一職責(zé)原則(即一個(gè)類只有一個(gè)變化的原因),復(fù)用性比較差。Bridge模式是比多繼承方案更好的解決方法。
4.Bridge模式的應(yīng)用一般在“兩個(gè)非常強(qiáng)的變化維度”,有時(shí)候即使有兩個(gè)變化的維度,但是某個(gè)方向的變化維度并不劇烈——換言之兩個(gè)變化不會(huì)導(dǎo)致縱橫交錯(cuò)的結(jié)果,并不一定要使用Bridge模式。
適用性:
1.如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個(gè)層次之間建立靜態(tài)的聯(lián)系。
2.設(shè)計(jì)要求實(shí)現(xiàn)化角色的任何改變不應(yīng)當(dāng)影響客戶端,或者說(shuō)實(shí)現(xiàn)化角色的改變對(duì)客戶端是完全透明的。
3.一個(gè)構(gòu)件有多于一個(gè)的抽象化角色和實(shí)現(xiàn)化角色,系統(tǒng)需要它們之間進(jìn)行動(dòng)態(tài)耦合。
4.雖然在系統(tǒng)中使用繼承是沒有問題的,但是由于抽象化角色和具體化角色需要獨(dú)立變化,設(shè)計(jì)要求需要獨(dú)立管理這兩者。
總結(jié)
Bridge模式是一個(gè)非常有用的模式,也非常復(fù)雜,它很好的符合了開放-封閉原則和優(yōu)先使用對(duì)象,而不是繼承這兩個(gè)面向?qū)ο笤瓌t。