桥接模式:将抽象部分与他的实现部分分离,使它们都可以独立地变化。
这里的实现指的是抽象类和它的派生类用来实现自己的对象。
1.实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,
减少它们之间的藕合。
2.在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,
而不能反过来,也就是个单向桥。
3.桥接模式使得抽象和实现可以独立变化,都可以分别扩充。也就是说抽象部分和实现部分是一种非常松散的关系。
4.桥接模式主要是把继承改成了使用对象组合,从而把两个纬度分开,让每一个纬度单独去变化,
最后通过对象组合的方式,把两个纬度组合起来,每一种组合的方式就相当于原来继承中的一种实现,
这样就有效的减少了实际实现的类的个数。
/** * 实现部分的抽象类 */ public abstract class Implementor { public abstract void operation(); }
/** *实现部分的具体实现类A */ public class ConcreteImplementorA extends Implementor{ @Override public void operation() { System.out.println("具体实现A的方法执行"); } }
/** *实现部分的具体实现类B */ public class ConcreteImplementorB extends Implementor{ @Override public void operation() { System.out.println("具体实现B的方法执行"); } }
/** * 抽象部分的类 */ public class Abstration { // 具体实现部分的对象 protected Implementor implementor; public void setImplementor(Implementor implementor){ this.implementor = implementor; } public void operation(){ implementor.operation(); } }
/** * 抽象部分的具体实现类 */ public class RefinedAbstration extends Abstration{ @Override public void operation() { implementor.operation(); } }
public static void main(String[] args) { // 抽象部分 Abstration ab = new RefinedAbstration(); // 具体实现类A ab.setImplementor(new ConcreteImplementorA()); ab.operation(); // 具体实现类B ab.setImplementor(new ConcreteImplementorB()); ab.operation(); }
桥接模式实例:(手机品牌软件)
/** * 手机软件 */ public abstract class HandsetSoft { public abstract void run(); }
/** * 手机游戏 */ 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 abstract class HandsetBrand { protected HandsetSoft soft; // 设置手机软件 public void setHandsetSoft(HandsetSoft soft){ this.soft = soft; } // 运行 public abstract void run(); }
/** * 手机品牌M */ public class HandsetBrandM extends HandsetBrand{ @Override public void run() { soft.run(); } }
/** * 手机品牌N */ public class HandsetBrandN extends HandsetBrand{ @Override public void run() { soft.run(); } }
public class Main { public static void main(String[] args) { HandsetBrand ab ; // 手机品牌N ab = new HandsetBrandN(); ab.setHandsetSoft(new HandsetGame()); ab.run(); ab.setHandsetSoft(new HandsetAddressList()); ab.run(); // 手机品牌M ab = new HandsetBrandM(); ab.setHandsetSoft(new HandsetGame()); ab.run(); ab.setHandsetSoft(new HandsetAddressList()); ab.run(); } }
运行结果如下:
运行手机游戏 运行手机通讯录 运行手机游戏 运行手机通讯录