桥接模式
桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化。
结构图
代码实现
抽象部分Abstraction
/** * 抽象 * * @author xukai 2016年3月28日 下午11:04:11 * */ public class Abstraction { protected Implementor implementor; public void setImplementor(Implementor implementor) { this.implementor = implementor; } public void operation() { implementor.operation(); } }
/** * 分离的实现 * * @author xukai 2016年3月28日 下午10:47:18 * */ public abstract class Implementor { public abstract void operation(); }
/** * 实现抽象类的具体实现方法 * * @author xukai 2016年3月29日 下午11:24:56 * */ public class ConcreteImplementorA extends Implementor { @Override public void operation() { System.out.println("具体实现A的方法执行"); } }
/** * 被提炼的抽象 * * @author xukai 2016年3月29日 下午11:28:45 * */ public class RefinedAbstraction extends Abstraction { @Override public void operation() { implementor.operation(); } }
public class Client { public static void main(String[] args) { Abstraction ab = new RefinedAbstraction(); ab.setImplementor(new ConcreteImplementorA()); ab.operation(); ab.setImplementor(new ConcreteImplementorB()); ab.operation(); } }控制台:
具体实现A的方法执行 具体实现B的方法执行
demo
问题:手机品牌和手机软件之间的关系
结构图
代码实现
手机软件抽象类:HandsetSoft/** * 手机软件 * * @author xukai 2016年3月28日 下午11:38:47 * */ public abstract class HandsetSoft { public abstract void run(); }
/** * 手机品牌 * * @author xukai 2016年3月28日 下午11:42:53 * */ public abstract class HandsetBrand { protected HandsetSoft soft; public void setSoft(HandsetSoft soft) { this.soft = soft; } public abstract void run(); }
具体品牌:
/** * 具体品牌 * * @author xukai 2016年3月29日 下午11:36:56 * */ public class HandsetBrandA extends HandsetBrand { @Override public void run() { soft.run(); } }
/** * 游戏软件 * * @author xukai 2016年3月28日 下午11:40:21 * */ public class HandsetGame extends HandsetSoft { @Override public void run() { System.out.println("运行手机游戏"); } }通讯录:
public class HandsetAddressList extends HandsetSoft { @Override public void run() { System.out.println("手机通讯录"); } }客户端:
public class Client { public static void main(String[] args) { HandsetBrand ab; // 品牌A手机 ab = new HandsetBrandA(); // 添加软件 ab.setSoft(new HandsetGame()); ab.run(); // 运行 // 添加软件 ab.setSoft(new HandsetAddressList()); ab.run(); // 运行 // 品牌B手机 ab = new HandsetBrandB(); // 添加软件 ab.setSoft(new HandsetGame()); ab.run(); // 运行 // 添加软件 ab.setSoft(new HandsetAddressList()); ab.run(); // 运行 } }控制台:
运行手机游戏 手机通讯录 运行手机游戏 手机通讯录
总结
合成/聚合:
聚合表示一种弱的“拥有”关系,体现A对象可以包含B对象,但是B对象不是A对象的一部分。(一只大雁和雁群)
合成是一种强的“拥有”关系,体现了严格的部分和整体的关系。(大雁翅膀和一只大雁)
*注:尽量少用继承,多用聚合/合成。
刚才手机品牌和手机软件的关系:
第一种:按照品牌分类
第二种:按照软件分类