橋接模式是一種結構型模式,它主要應對的是:由於實際的需要,某個類具有兩個或兩個以上的維度變化,如果只是用繼承將無法實現這種需要,或者使得設計變得相當臃腫。
橋接模式的做法是把變化部分抽象出來,使變化部分與主類分離開來,從而將多個維度的變化徹底分離。最后,提供一個管理類來組合不同維度上的變化,通過這種組合來滿足業務的需要。
舉個例子,對於筆記本的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