【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

什么是桥接模式(Bridge)

概念

桥接模式的定义如下:**将抽象与实现分离,使它们可以独立变化。**这个概念说得很抽象,意思是将实现部分中的抽象部分分离出来,让抽象部分和实现部分间的耦合度降低。

抽象化:将复杂事物*同的特性抽象出来,对于面向对象来说就是把各种对象的特性抽象成一个类。

实现化:针对抽象化的具体实现。

桥接模式主张采用组合关系代替多层继承关系,继承关系会让实现类数量呈指数级增长,类的耦合程度也会提高。

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

例如,现在想要设计产品类,小米和华为都有手机和平板,现在想要设计它们的产品类,如果想要通过继承的方式去设计,那么类的数量就是n * m=2 * 2,如果以后想再加一个产品,就是2 * 3了,如果加n个产品和n个品牌,类的数量就会爆炸式增长。

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

如果采用组合的方式来设计的话,只需要设计手机设备类、平板设备类、华为品牌类、小米品牌类,然后具体的实现由它们去组合就可以了。可以看到,虽然现在也是需要创建四个类,但如果想要再增加一个产品,就只需要再写多一个类。

优点

  1. 抽象和实现分离,提高系统可扩展性
  2. 符合开放封闭原则
  3. 提高了类的复用。
  4. 降低类间的耦合程度。

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

缺点

  1. 需要对系统需求的理解,能够清除需要实现什么功能的类,以及一定的针对抽象层设计能力,能够在两个维度把这些类区分开来。
  2. 存在一定的局限性。桥接模式在能够正确识别出两个维度的情况下才可以使用。

总体来说就是对设计有要求。

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

原则

“+”代表遵守,“-”代表不遵守或者不相关

原则 开放封闭 单一职责 迪米特 里氏替换 依赖倒置 接口隔离 合成复用
+ + - - + + +

适用场景(动机)

  1. 存在多层继承。使用桥接模式来处理这种情况可以避免系统类指数级增涨的情况。
  2. 实现类会在两个独立变化的维度上扩展。这也是桥接模式在做的事情。

如何实现

想要实现桥接模式,就需要以下几个东西:

  1. 抽象化抽象类:定义一个抽象类,对抽象化接口进行一个引用,达成和抽象化接口的组合关系。
  2. 抽象化抽象类的实现类:这些类用来实现业务逻辑。
  3. 抽象化接口:另外一个维度的抽象层,供抽象化抽象类调用。
  4. 抽象化接口实现类:实现该维度的业务逻辑。

抽象化只是我想加的一个形容词,加上有点长,不加又觉得意思不够,觉得长的可以省略掉。

上类图

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

上代码

这里实现上述的手机品牌的例子

抽象化抽象类:Abstraction

/**
 *
 * 模拟品牌类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public abstract class Abstraction {
    protected Implementor device;

    public Abstraction(Implementor device){
        this.device=device;
    }

    public abstract void operate();

}

抽象化抽象类的实现类:RefinedAbstraction

/**
 *
 * 模拟小米品牌类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public class RefinedAbstraction extends Abstraction{


    public RefinedAbstraction(Implementor device) {
        super(device);
    }

    @Override
    public void operate() {
        System.out.print("this is xiaomi:");
        device.operate();
    }
}

抽象化接口:Implementor

/**
 * 模拟设备类
 *
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public interface Implementor {

    void operate();
}

抽象化接口实现类:

/**
 *
 * 模拟手机设别类
 * Created on 2021/5/30.
 *
 * @author xuxiaobai
 */
public class ConcreteImplementor implements  Implementor{
    @Override
    public void operate() {
        System.out.println("手机");
    }
}

测试类:BridgeTest

public class BridgeTest {
    public static void main(String[] args) {
        Abstraction phone = new RefinedAbstraction(new ConcreteImplementor());

        phone.operate();
        
    }
    /**
     * 输出结果:
     * this is xiaomi:手机
     */
}

这里简单地做了一个手机品牌的例子,

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

总结

桥接模式主要遵守了依赖倒置原则,也是在提倡接口编程,提供了一个接口编程的方式,遵守了里氏替换原则、单一职责原则,开放封闭原则,总之就是基本上满足大部分设计原则,是一个非常优秀的设计模式,实现起来也不会太难。我们在设计类结构的时候能用上就用上。

当积累了一定的开发经验,可能也会自然而然地就用上这个模式了,我之前也遇到过一个程序员,没有学过设计模式,他也很轻视地跟我说学这些有什么用,我没学也一样能够完成需求。确实,他在一次设计类结构时就是用到了桥接模式,我也是后知后觉。我也不是叫大家不要学习设计模式,毕竟设计模式是前人总结的经验,学习能让我们少走一些弯路。

【设计模式】为什么要叫桥接模式?学完了我也没搞懂!

我觉得在抽象层的设计,多个维度也是可以的,只需要定义多个抽象化接口即可,不过多个维度情况很少,太多维度了,使用者也是把握不住的。

上一篇:PDRIVER_OBJECT


下一篇:PyTorch 实战(模型训练、模型加载、模型测试)