桥接模式
桥接模式,将抽象部分与它的实现部分分离,使他们都可以独立地变化。
结构图
代码实现
抽象部分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对象的一部分。(一只大雁和雁群)
合成是一种强的“拥有”关系,体现了严格的部分和整体的关系。(大雁翅膀和一只大雁)
*注:尽量少用继承,多用聚合/合成。
刚才手机品牌和手机软件的关系:
第一种:按照品牌分类
第二种:按照软件分类
这两种办法都会导致强耦合,一旦添加某个功能,过于复杂。
桥接模式的“将抽象部分和它的实现部分分离”,指的是实现系统可能有多角度分类,每种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。