设计模式学习笔记——桥接模式

来源:互联网 发布:悠唐网络是真的吗 编辑:程序博客网 时间:2024/06/10 03:39

桥接模式

桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化。

结构图

代码实现

抽象部分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();}}

分离的实现抽象类Implementor
/** * 分离的实现 * * @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 {@Overridepublic void operation() {System.out.println("具体实现A的方法执行");}}

被提炼的抽象,RefinedAbstraction
/** * 被提炼的抽象 * * @author xukai 2016年3月29日 下午11:28:45 *  */public class RefinedAbstraction extends Abstraction {@Overridepublic 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();}

手机品牌抽象类:HandsetBrand
/** * 手机品牌 * * @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 {@Overridepublic void run() {soft.run();}}

具体手机游戏软件:
/** * 游戏软件 * * @author xukai 2016年3月28日 下午11:40:21 *  */public class HandsetGame extends HandsetSoft {@Overridepublic void run() {System.out.println("运行手机游戏");}}
通讯录:
public class HandsetAddressList extends HandsetSoft {@Overridepublic 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对象的一部分。(一只大雁和雁群)
合成是一种强的“拥有”关系,体现了严格的部分和整体的关系。(大雁翅膀和一只大雁)

*注:尽量少用继承,多用聚合/合成。

刚才手机品牌和手机软件的关系:
第一种:按照品牌分类

第二种:按照软件分类

这两种办法都会导致强耦合,一旦添加某个功能,过于复杂。

桥接模式的“将抽象部分和它的实现部分分离”,指的是实现系统可能有多角度分类,每种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。


0 0