设计模式桥接模式

概念

  • 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化
  • 桥接模式的具体解决方案:桥接模式通过将继承改为组合的方式来解决多维度的扩展问题。具体来说,就是抽取其中一个维度并使之成为独立的类层次,这样就可以在初始类中引用这个新层次的对象(这也就是桥接模式中的所说的桥),从而使得一个类不必拥有所有的状态和行为。
  • 抽象部分与实现部分:这里的抽象部分与实现部分与编程语言中的抽象实现无关。抽象部分是一些实体的高阶控制层,该层自身不完成任何具体的工作,它需要将工作委派给实现部分层(也被称为平台)。在实际的程序中,抽象部分是图形用户界面(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();
    }
}
制作小杯牛奶咖啡
制作小杯加糖咖啡
制作中杯牛奶咖啡
制作中杯加糖咖啡
制作大杯牛奶咖啡
制作大杯加糖咖啡
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值