重学设计模式之桥接模式

目录

  • 桥接模式是什么?
  • 使用场景
  • 代码实现

桥接模式是什么?

  • 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化
  • 桥接模式的具体解决方案:桥接模式通过将继承改为组合的方式来解决多维度的扩展问题。具体来说,就是抽取其中一个维度并使之成为独立的类层次,这样就可以在初始类中引用这个新层次的对象(这也就是桥接模式中的所说的桥),从而使得一个类不必拥有所有的状态和行为。
  • 抽象部分与实现部分:这里的抽象部分与实现部分与编程语言中的抽象实现无关。抽象部分是一些实体的高阶控制层,该层自身不完成任何具体的工作,它需要将工作委派给实现部分层(也被称为平台)。在实际的程序中,抽象部分是图形用户界面(GUI),而实现部分则是底层操作系统代码(API),GUI 层调用 API 层来对用户的各种操作做出响应。GUI、和 API 可以进行独立的扩展。

structure-zh-2x.png

使用场景

  1. 一个系统需要在构建的抽象化橘色和具体化角色间增加更多灵活性,避免在两个层次间建立静态继承关系,可以通过桥接模式使他们在抽象层建立一个关联关系。
  2. 一个类存在两个独立变化的维度,切两个维度都需要扩展。
  3. 对于不希望使用继承或因多层次继承导致系统类的个数急剧增加的系统,也可使用桥接模式。

代码实现

  • 实现部分的抽象接口
public interface CoffeeAdditives {
    String addSomething();
}
复制代码
  • 实现部分的实现
public class Milk implements CoffeeAdditives{
    @Override
    public String addSomething() {
        return "牛奶";
    }
}

public class Sugar implements CoffeeAdditives {

    @Override
    public String addSomething() {
        return "加糖";
    }
}
复制代码
  • 抽象部分的实现
public abstract class Coffee {

    protected CoffeeAdditives mCoffeeAdditives;

    public Coffee(CoffeeAdditives coffeeAdditives) {
        mCoffeeAdditives = coffeeAdditives;
    }

    abstract void makeCoffee();
}
复制代码
  • 抽象部分多子类
public class SmallCoffee extends Coffee {

    public SmallCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    void makeCoffee() {
        System.out.println("制作小杯"  +mCoffeeAdditives.addSomething()+ "咖啡");
    }
}
public class MiddleCoffee extends Coffee {

    public MiddleCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    void makeCoffee() {
        System.out.println("制作中杯" + mCoffeeAdditives.addSomething() + "咖啡");
    }
}
public class LargeCoffee extends Coffee {

    public LargeCoffee(CoffeeAdditives coffeeAdditives) {
        super(coffeeAdditives);
    }

    @Override
    void makeCoffee() {
        System.out.println("制作大杯" + mCoffeeAdditives.addSomething() + "咖啡");
    }
}
复制代码
  • 客户端调用
public class MakeCoffeeTest {

    @Test
    public void makeCoffee() {
        new SmallCoffee(new Milk()).makeCoffee();
        new SmallCoffee(new Sugar()).makeCoffee();
        new MiddleCoffee(new Milk()).makeCoffee();
        new MiddleCoffee(new Sugar()).makeCoffee();
        new LargeCoffee(new Milk()).makeCoffee();
        new LargeCoffee(new Sugar()).makeCoffee();
    }
}
制作小杯牛奶咖啡
制作小杯加糖咖啡
制作中杯牛奶咖啡
制作中杯加糖咖啡
制作大杯牛奶咖啡
制作大杯加糖咖啡
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享