设计模式(九)之桥接模式

类的功能层次结构

现在有一个类,我们想在Something中增加新的功能,会编写一个Something的子类,即SomethingGood,想在SomethingGood上增加新的功能,又会新建一个子类SomethingBetter,这就是类的功能层次结构,随着功能的增多层次加深。
在这里插入图片描述

  • 父类具有基本功能
  • 子类中增加新的功能

类的实现层次结构

抽象类声明了一些抽象方法,定义接口,然后子类负责去实现这些抽象方法。
这里的层次结构并不是用于增加功能,而是用于实现功能任务的分组
在这里插入图片描述

  • 父类通过声明抽象方法来定义接口
  • 子类通过实现具体的方法来实现接口

什么是桥接模式

Bridge的意思是桥梁。桥梁的功能就是将河流两侧连接起来。桥接模式就是指将两样东西连接起来,他们分别是类的功能层次结构类的实现层次结构

例子

ps:例子取自https://www.liaoxuefeng.com/wiki/1252599548343744/1281319266943009#0
假设某个汽车厂商生产三种品牌的汽车:Big、Tiny和Boss,每种品牌又可以选择燃油、纯电和混合动力。如果用传统的继承来表示各个最终车型,一共有3个抽象类加9个最终子类:
在这里插入图片描述
抽象类Car

package StructuralPattern.BridgeMode;

/**
 * 汽车类
 */

public abstract class Car {
    
    
    public Engine engine;

    public Car(Engine engine){
    
    
        this.engine = engine;
    }

    public abstract void drive();
}

引擎接口

package StructuralPattern.BridgeMode;

/**
 * 引擎
 */

public interface Engine {
    
    
    void start();
}

修正类(桥接类)

package StructuralPattern.BridgeMode;

/**
 * 修正类(桥接Car和Engine)
 */

public abstract class RefinedCar extends Car{
    
    

    public RefinedCar(Engine engine){
    
    
        super(engine);
    }

    @Override
    public void drive() {
    
    
        this.engine.start();
        System.out.println("Drive "+getBrand()+" car...");
    }

    public abstract String getBrand();
}

Car子类

/**
 * BossCar
 */

public class BossCar extends RefinedCar{
    
    

    public BossCar(Engine engine){
    
    
        super(engine);
    }
    @Override
    public String getBrand() {
    
    
        return "Boss";
    }
}

Engine实现类

package StructuralPattern.BridgeMode;

/**
 * 混合型引擎
 */

public class HybridEngine implements Engine{
    
    
    @Override
    public void start() {
    
    
        System.out.println("Start Hybrid Engine...");
    }
}

结果
在这里插入图片描述

总结

采用传统的继承方法,如果要新增一个品牌,或者加一个新的引擎(比如核动力),那么子类的数量增长更快。为了避免子类数量爆炸,使用桥接模式可以很好的解决这个问题。
从上面例子很容易看出使用桥接模式,可以把汽车和引擎当作两个维度,新增汽车品牌只需增加一个修正类的子类,新增一款引擎也只需要实现引擎接口,使得Car和Engine可以自由变化

猜你喜欢

转载自blog.csdn.net/weixin_43636205/article/details/130055207