将抽象部分与实现部分分开
示例:
image.png
在两个维度上可以自由地添加类,而不会影响到其它的类
结构
image.png

桥模式的组件

Abstraction

  • 定义抽象的接口。
  • 维护对Implementor类型的对象的引用。

RefinedAbstraction

  • 扩展抽象定义的接口。

Implementor** **

  • 定义实现类的接口。
  • 这个接口不必完全对应于抽象的接口;事实上,这两个接口可能完全不同

Typically** **

  • 实现接口仅提供原始操作
  • 抽象接口定义基于原始操作的高层操作

The ConcreteImplementors : **ImplementorA and ImplementorB**

  • 实现 Implementor 接口
  • 定义其具体实现

    优点

  1. 将接口与实现解耦
    • 实现部分动态配置
    • 取消编译时对实现部分的依赖
    • 改变实现类不需要重新编译抽象类与客户类
  2. 改善了可扩展性
  3. 对用户隐藏实现细节

    何时使用桥模式

    当您想避免抽象与实现之间的永久绑定时,请使用桥接模式。
    当必须在运行时选择或切换实现时
    典型示例
    image.png

    代码示例

    image.png
    class ButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals ( FINDPRICE )) {
    String size = getTeaCup(); //获得用户输入:杯子大小
    String kind = getTeaKind(); //获得用户输入:茶种类
    //Create a TeaKindobject
    if( kind.compareTo(GREENTEA)==0 )
    tKind = new GreenTea();
    if( kind.compareTo(REDTEA)==0 )
    tKind = new RedTea();
    if(size.compareTo(SUPERCUP)==0)
    tCup= new Super(tKind);
    if(size.compareTo(MEDIUMCUP)==0)
    tCup= new Medium(tKind);
    float price = tCup.getPrice();
    }
    }
    }
    抽象接口类
    public interface **TeaCup** {
    public abstract float getPrice();
    }
    抽象部分子类
    public class Medium implements **TeaCup**{
    private TeaKind tk;
    public Medium (TeaKind tKind){
    tk = tKind;
    }
    public float getPrice(){
    float teaPrice = tk.price();
    return teaPrice;
    }
    }
    实现部分的抽象接口
    public interface **TeaKind** {
    public abstract float price();
    }
    实现部分的实现类
    public class **RedTea implements TeaKind**{
    private final float PRICE = 2.5f;
    public float price(){
    return PRICE;
    }
    }