一,定义
桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化。
什么叫抽象与它的实现分离,这并不是说,让抽象类和派生类分离,因为这没有任何意义,实现指的是抽象类和它的派生类用来实现自己的对象。
说白了就是实现系统可能有多种角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们之间的耦合。
二,示例
按照不同的手机品牌,运行不同的手机软件。
由于实现方式有多种,桥接模式的核心意图就是把这些实现独立出来,让他们个子的变化,这就使得每种实现的变化不会影响其他的实现,从而达到应对变化的目的。
/**
* @类描述:手机品牌
*/
public abstract class HandsetBrand {
protected HandsetSoft soft;
public void setHandsetSoft(HandsetSoft soft){
this.soft = soft;
}
public abstract void run();
}
public class HandsetBrandN extends HandsetBrand {
@Override
public void run() {
System.out.print("手机品牌N,");
soft.run();
}
}
public class HandsetBrandM extends HandsetBrand {
@Override
public void run() {
System.out.print("手机品牌M,");
soft.run();
}
}
/**
* @类描述:手机软件
*/
public abstract class HandsetSoft {
public abstract void run();
}
public class HandsetAddressList extends HandsetSoft {
@Override
public void run() {
System.out.println("运行手机通讯录");
}
}
public class HandsetGame extends HandsetSoft {
@Override
public void run() {
System.out.println("运行手机游戏");
}
}
//test main
//桥接模式
public static void bridgeModel(){
HandsetBrand ab;
ab = new HandsetBrandN();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
ab = new HandsetBrandM();
ab.setHandsetSoft(new HandsetGame());
ab.run();
ab.setHandsetSoft(new HandsetAddressList());
ab.run();
}
输出结果:
手机品牌N,运行手机游戏
手机品牌N,运行手机通讯录
手机品牌M,运行手机游戏
手机品牌M,运行手机通讯录
三,总结
应用场景:
- 如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。
- 如果出现抽象部分和实现部分都应该可以扩展的情况,可以采用桥接模式,让抽象部分和实现部分可以独立的变化,从而可以灵活的进行单独扩展,而不是搅在一起,扩展一边会影响到另一边。
- 如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。
- 如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。
要点:
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
- 抽象化角色和具体化角色都应该可以被子类扩展。在这种情况下,桥接模式可以灵活地组合不同的抽象化角色和具体化角色,并独立化地扩展。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
参考:《大话设计模式》 http://www.cnblogs.com/jingmoxukong/p/4224661.html