1.什么是桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。(即常用于有两个变化维度的系统)
2.学习桥接模式
- 用抽象关联取代了传统的多层继承
- 将类之间的静态继承关系转换为动态的对象组合关系
3.桥接模式代码实现
代码基本结构
- 抽象类
- 扩充抽象类
- 实现类接口
- 具体实现类
实例分析
现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能。本实例使用桥接模式来模拟毛笔的使用过程。
实现类接口
public interface Color{ void bepaint(String penType,String name);}
具体实现类
public class Red implements Color{ public void bepaint(String penType,String name){ System.out.println(penType+"红色的"+name+"."); }}
public class Green implements Color{ public void bepaint(String penType,String name){ System.out.println(penType+"红色的"+name+"."); }}
public class Blue implements Color{ public void bepaint(String penType,String name){ System.out.println(penType+"红色的"+name+"."); }}
public class White implements Color{ public void bepaint(String penType,String name){ System.out.println(penType+"红色的"+name+"."); }}
public class Black implements Color{ public void bepaint(String penType,String name){ System.out.println(penType+"红色的"+name+"."); }}
抽象类
1.为什么这里是抽象类?
因为可以和别人建立关联,如果使用接口则不能实现!
2.为什么使用protected?
被 protected 修饰的成员对于本包和其子类可见。(在子类当中使用!!)
public abstract class Pen{ //1.建立关联 protected Color color; //2.set注入 public void setColor(Color color){ this.color=color; } //抽象方法 public abstract void draw(String name);}
扩充抽象类
public class BigPen extends Pen{ public void draw(String name){ String penType="大号毛笔"; this.color.bepaint(penType,name); }}
public class MiddlePen extends Pen{ public void draw(String name){ String penType="中号毛笔"; this.color.bepaint(penType,name); }}
public class SmallPen extends Pen{ public void draw(String name){ String penType="小号毛笔"; this.color.bepaint(penType,name); }}
练习题目
考虑一个自动茶水销售机的例子,该机器销售的茶水价格与两个维度:杯子大小与茶叶品种有关。
杯子的体积上暂时分为小杯,大杯(大杯价格是小杯2倍);
在茶叶品种上,分为红茶(4元一小杯)和绿茶(3元一小杯)。
实现类接口
public intrface Tea{ float price();}
具体实现类
public class RedTea implements Tea{ public float price(){ return 4.0f; }}
public class GreenTea implements Tea{ public float price(){ return 3.0f; }}
抽象类
public abstract class TeaSize{ protected Tea tea; public void setTea(Tea tea){ this.tea=tea; } public abstract float price();}
扩充抽象类
public class BigSize extends TeaSize{ public float price(){ return this.tea.price()*2; }}
public class SmallSize extends TeaSize{ public float price(){ return this.tea.price(); }}
如果未来需要增加中杯(小杯价格的1.5倍),如何实现?
在扩充抽象类中加MiddleSize类!
如果未来需要增加黑茶(5元1小杯),如何实现?
在具体实现类中添加BlackTea!
结论:在两个维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则
4.桥接模式的适用环境
- 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
- 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
- 不希望使用继承或因为多层继承导致系统