桥接模式是一种结构型模式,它主要应对的是:由于实际的需要,某个类具有两个或两个以上的维度变化,如果只是用继承将无法实现这种需要,或者使得设计变得相当臃肿。
桥接模式的做法是把变化部分抽象出来,使变化部分与主类分离开来,从而将多个维度的变化彻底分离。最后,提供一个管理类来组合不同维度上的变化,通过这种组合来满足业务的需要。
举个例子,对于笔记本的CPU评测,当安装Intel CPU的时候 评测分数比较高,而安装AMD CPU的时候,则评测分数相对低一些,这个是一唯影响,而配合上电脑品牌,就是二维影响
先看下面的代码
1 interface CpuAbility{ 2 3 String abilityCpu(); 4 } 5 6 class AdmCpu implements CpuAbility{ 7 8 public String abilityCpu() { 9 // TODO Auto-generated method stub 10 return "系能一般"; 11 } 12 } 13 class IntelCpu implements CpuAbility{ 14 public String abilityCpu() { 15 // TODO Auto-generated method stub 16 return "系能比较牛"; 17 } 18 } 19 20 abstract class AbstractComputer{ 21 22 CpuAbility cpuAbility; 23 24 public AbstractComputer(CpuAbility cpuAbility){ 25 this.cpuAbility=cpuAbility; 26 27 } 28 29 30 public abstract void checkPcAbility(); 31 32 } 33 34 class LenevoComputer extends AbstractComputer{ 35 36 public LenevoComputer(CpuAbility cpuAbility) { 37 super(cpuAbility); 38 // TODO Auto-generated constructor stub 39 } 40 41 @Override 42 public void checkPcAbility() { 43 System.out.println("华硕笔记本CPU性能"+super.cpuAbility.abilityCpu()); 44 } 45 46 } 47 class IswComputer extends AbstractComputer{ 48 49 public IswComputer(CpuAbility cpuAbility) { 50 super(cpuAbility); 51 // TODO Auto-generated constructor stub 52 } 53 54 @Override 55 public void checkPcAbility() { 56 System.out.println("IBM笔记本CPU性能"+super.cpuAbility.abilityCpu()); 57 } 58 59 }
执行代码并输出
1 CpuAbility ability =new IntelCpu(); 2 AbstractComputer computer =new LenevoComputer(ability); 3 computer.checkPcAbility(); 4 ability =new AdmCpu();//华硕笔记本CPU性能系能比较牛 5 computer =new IswComputer(ability); 6 computer.checkPcAbility();//IBM笔记本CPU性能系能一般
可以看到,通过对象组合的方式,Bridge 模式把两个角色之间的继承关系改为了耦合的关系,从而使这两者可以从容自若的各自独立的变化,这也是Bridge模式的本意。
Bridge模式是构造型的设计模式之一。Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
结构如下图所示:
参考地址:
http://blog.csdn.net/jason0539/article/details/22568865
http://hi.baidu.com/isswangqing/item/126e4318bd99a708e65c36b3
http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010111843618596/
http://www.blogjava.net/wangle/archive/2007/04/25/113545.html