1.概述
1.1 定义
桥接模式的用意就是将抽象化与实现化进行解耦,将抽象部分与它的实现部分分离,使得它们都可以独立的变化。
1.2 合成/聚合复用原则
合成和聚合都是关联的特殊种类,其原则就是尽量使用合成/聚合,尽量不要使用类继承。
1.2.1 聚合
聚合表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分。
1.2.2 合成
合成则是一种强的拥有关系,体现了严格的部分与整体的关系,部分与整体的生命周期是一样的。
1.2.3 举例
比如大雁有两个翅膀,其翅膀和大雁是部分与整体的关系,并且它们的生命周期是一样的,所以说大雁和翅膀就是合成关系;而大雁和种群属于聚合关系,每只大雁属于一个种群,一个种群可以有多只大雁。类图如下所示:
1.3 继承
盲目使用继承可能会造成麻烦,继承是一种强耦合的结构,父类改变,其子类就会随着改变。所以在使用继承的时候,一定要是在 “is - a” 的关系时再考虑使用,而不是在任何时候都使用继承。
2.类图
3.角色
1.Abstraction(抽象类) 定义了抽象类的接口,并维护抽象实现类。 2.RefinedAbstraction(扩充的抽象类) 它扩充由Abstraction定义的接口 3.Implementor(抽象实现类接口) 用于定义实现类的接口 4.ConcreteImplementor 具体的实现类
4.案例
4.1 说明
这里以手机品牌和手机软件为案例。手机品牌有不同的种类,其手机软件同样也有不同的种类。为不同品牌的手机添加不同种类的手机软件。
4.2 类图
手机品牌的类图如下所示:
手机软件的类图如下所示:
二者合并后的类图如下所示:
4.3 代码
手机软件抽象类:
/** * 手机软件抽象类 * @author Administrator */ abstract class HandsetSoft { public abstract void add(); }
手机游戏软件具体实现类:
/** * 手机游戏具体实现类 * @author Administrator */ public class HandsetGame extends HandsetSoft{ @Override public void add() { System.out.println("添加手机游戏软件!"); } }
手机通讯录软件具体实现类:
/** * 手机通讯录具体实现类 * @author Administrator */ public class HandsetAddressList extends HandsetSoft{ @Override public void add() { System.out.println("添加手机通讯录软件!"); } }
手机品牌抽象类:
/** * 手机品牌抽象类 * @author Administrator */ abstract class HandsetBrand { //拥有手机软件对象 protected HandsetSoft soft; //设置手机软件 public void setHandsetSoft(HandsetSoft soft) { this.soft = soft; } //运行软件 public abstract void add(); }
手机品牌A具体实现类:
/** * 手机品牌A具体实现类 * @author Administrator */ public class HandsetBrandA extends HandsetBrand{ @Override public void add() { System.out.print("为手机品牌A:"); soft.add(); } }
手机品牌B具体实现类:
/** * 手机品牌B具体实现类 * @author Administrator */ public class HandsetBrandB extends HandsetBrand{ @Override public void add() { System.out.print("为手机品牌B:"); soft.add(); } }
客户端类:
/** * 客户端类 * @author Administrator */ public class Client { public static void main(String[] args) { //创建手机品牌B对象 HandsetBrand b = new HandsetBrandB(); //为手机品牌B添加游戏软件 b.setHandsetSoft(new HandsetGame()); b.add(); //为手机品牌B添加通讯录软件 b.setHandsetSoft(new HandsetAddressList()); b.add(); //创建手机品牌A对象 HandsetBrand a = new HandsetBrandA(); //为手机品牌B添加游戏软件 a.setHandsetSoft(new HandsetGame()); a.add(); //为手机品牌B添加通讯录软件 a.setHandsetSoft(new HandsetAddressList()); a.add(); } }
运行结果:
为手机品牌B:添加手机游戏软件! 为手机品牌B:添加手机通讯录软件! 为手机品牌A:添加手机游戏软件! 为手机品牌A:添加手机通讯录软件!
4.4 总结
如果使用继承的方式去实现上述功能的话,会造成大量类的增加,不能满足开放封闭原则。如果系统中有多种分类,且每种分类都有多种变化的话,那么就采用桥接模式,让这些变化独立的进行变化,减少它们的耦合。
5.优缺点
5.1 优点
1.将抽象与实现分离,提高了系统的可扩展性。 2.其实现细节对客户透明。 5.2 缺点
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。