桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。什么叫抽象与它的实现分离?这并不是说,让抽象类与其派生类分离,实现指的是抽象类和它的派生类用来实现自己的对象。
以手机为例。手机有各个品牌,手机又得实现各种软件的运行。
由于实现的方式 有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自地变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。
1 /** 2 * 手机软件接口 3 */ 4 public interface IHandsetSoft { 5 void run(); 6 }
1 /** 2 * 手机游戏(属于软件) 3 */ 4 public class HandsetGame implements IHandsetSoft { 5 @Override 6 public void run() { 7 System.out.println("运行手机游戏"); 8 } 9 }
1 /** 2 * 手机通讯录 3 */ 4 public class HandsetAddressList implements IHandsetSoft { 5 @Override 6 public void run() { 7 System.out.println("运行手机通讯录"); 8 } 9 }
1 public class HandsetMP3 implements IHandsetSoft { 2 @Override 3 public void run() { 4 System.out.println("运行MP3"); 5 } 6 }
1 public abstract class HandsetBrand { 2 IHandsetSoft soft; 3 //安装手机软件 4 public void setHandsetSoft(IHandsetSoft soft){ 5 this.soft=soft; 6 } 7 //运行 8 public abstract void run(); 9 }
1 /** 2 * 手机品牌华为 3 */ 4 public class HandsetBrandHuawei extends HandsetBrand{ 5 @Override 6 public void run() { 7 soft.run(); 8 } 9 }
1 public class HandsetBrandXiaoMi extends HandsetBrand { 2 @Override 3 public void run() { 4 soft.run(); 5 } 6 }
1 public class Client { 2 public static void main(String[] args) { 3 HandsetBrand ab; 4 ab=new HandsetBrandHuawei(); 5 //华为安装游戏软件 6 ab.setHandsetSoft(new HandsetGame()); 7 ab.run(); 8 //华为安装通讯录软件 9 ab.setHandsetSoft(new HandsetAddressList()); 10 ab.run(); 11 12 ab=new HandsetBrandXiaoMi(); 13 //小米安装游戏软件 14 ab.setHandsetSoft(new HandsetGame()); 15 ab.run(); 16 //小米安装游戏软件 17 ab.setHandsetSoft(new HandsetAddressList()); 18 ab.run(); 19 //小米安装游戏软件 20 ab.setHandsetSoft(new HandsetMP3()); 21 ab.run(); 22 } 23 }
桥接是一个接口,它与一方应该是绑定的,也就是解耦的双方中的一方必然是继承这个接口的,这一方就是实现方,而另一方正是要与这一方解耦的抽象方,如果不采用桥接模式,一般我们的处理方式是直接使用继承来实现,这样双方之间处于强链接,类之间关联性极强,如要进行扩展,必然导致类结构急剧膨胀。采用桥接模式,正是为了避免这一情况的发生,将一方与桥绑定,即实现桥接口,另一方在抽象类中调用桥接口(指向的实现类),这样桥方可以通过实现桥接口进行单方面扩展,而另一方可以继承抽象类而单方面扩展,而之间的调用就从桥接口来作为突破口,不会受到双方扩展的任何影响