设计模式 | 桥接模式

知识点十一:桥接模式


一、概述

桥接模式又叫做Bridge模式,属于23种GOF设计模式的结构型设计模式 。桥接模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。


二、优缺点及使用场景

1、优点

  • 分离抽象接口及其实现部分。提高了比继承更好的解决方案。
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明,可以对用户隐藏实现细节。

2、缺点

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

3、模式使用场景

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

三、场景中的角色及功能和实现方式

1、角色

  • Abstraction 抽象类接口(接口或抽象类):维护对行为实现(Implementor)的引用。它的角色就是桥接类。
  • Refined Abstraction:Abstraction子类
  • Implementor 行为实现类接口:Abstraction接口定义了基于Implementor接口的更高层次的操作
  • Concretelmplementor:Implementor子类

2、实现方式

桥接模式.png 桥接模式.png


四、在Java中的实现

解决问题:在汽车生产中不同用途的车会搭配不同的发动机。

普通解决方法(直接上图了,不写代码了。。):

普通实现.png

使用桥接模式:

Engine.java

/**
 * @Description: 行为实现接口,安装发动机
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 16:19
 */
public interface Engine {
    public void installEngine();
}

Engine2000.java

/**
 * @Description: 行为实现,安装2000CC的发动机
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 16:20
 */
public class Engine2000 implements Engine {
    public void installEngine() {
        System.out.println("安装2000CC的发动机");
    }
}

Engine2200.java

/**
 * @Description: 行为实现,安装2200CC的发动机
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 16:35
 */
public class Engine2200 implements Engine {
    public void installEngine() {
        System.out.println("安装2200的发动机");
    }
}

Car.java

/**
 * @Description: car,桥接类
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 15:42
 */
public abstract class Car {
    //桥接模式的关键,接口的引用,扩展很方便
    private Engine engine;

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

    public Engine getEngine() {
        return engine;
    }

    public void setEngine(Engine engine) {
        this.engine = engine;
    }

    public abstract void installEngine();
}

Bus.java

/**
 * @Description: 具体实现
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 16:09
 */
public class Bus extends Car {

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

    public void installEngine() {
        System.out.print("Bus:");
        this.getEngine().installEngine();
    }
}

Taxi.java

/**
 * @Description: 具体实现
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 17:14
 */
public class Taxi extends Car {
    public Taxi(Engine engine) {
        super(engine);
    }

    public void installEngine() {
        System.out.print("Taxi:");
        this.getEngine().installEngine();
    }
}

MainClass.java

/**
 * @Description: 客户端调用
 * @Author: Ling.D.S
 * @Date: Created in 2018/11/16 15:32
 */
public class MainClass {
    public static void main(String[] args) {
        //先做2种型号的发动机
        Engine engine2000 = new Engine2000();
        Engine engine2200 = new Engine2200();

        //将发动机嵌入到相应的车中
        Car bus = new Bus(engine2200);
        bus.installEngine();

        Car taxi = new Taxi(engine2000);
        taxi.installEngine();
    }
}

转载请注明原地址,宋德凌的博客:http://CoderOfSong.github.io 谢谢!

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦