设计模式之桥接模式

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之桥接模式相关的知识,希望对你有一定的参考价值。

1.简要概述

  • 桥接模式就是将实现和抽象放在两个不同的类层次中,也就是将抽象和实现分离开来,使它们可以独立变化。
  • 桥接模式基于类的最小设计原则,通过使用封装、聚合以及继承等行为让不同的类承担不同的职责。

2.问题引入

假设我们要处理一个电脑销售的逻辑任务,这里电脑有三种类型,每种类型又分别对应三种不同的品牌,如下图:

如果我们用传统继承的方式来处理此任务的话,明显会存在以下问题:

  • 如果我们想再增加一种电脑类型或者电脑品牌的话,就需要对应的添加电脑品牌或者对应的电脑类型,这无疑造成了扩展上的问题。
  • 如果我们修改了某一种电脑类型的实现逻辑,那么对应的电脑品牌逻辑也要跟着修改,这就违背了单一职责原则。

3.模式结构

👉通常由一个抽象类接口( 负责维护实现类,充当桥 ),多个具体的抽象子类( 负责实现抽象类的内部逻辑 ),一个实现类接口( 负责定义需要实现的行为方法 ),多个具体的实现子类( 负责具体行为的实现逻辑 ),一个客户类( 负责调用桥接抽象类实现某种行为创建 )共同组成。

4.实现代码

举例 💡 :以上面提到的电脑问题为例,利用桥接模式进行处理。

电脑品牌实现类接口

public interface ComputerBrand {
    public void on();

    public void off();
}

联想电脑品牌实现类

public class Lenovo implements ComputerBrand {
    @Override
    public void on(){
        System.out.println("联想品牌电脑开机");
    }

    @Override
    public void off(){
        System.out.println("联想品牌电脑关机");
    }
}

戴尔电脑品牌实现类

public class Dell implements ComputerBrand {
    @Override
    public void on(){
        System.out.println("戴尔品牌电脑开机");
    }

    @Override
    public void off(){
        System.out.println("戴尔品牌电脑关机");
    }
}

电脑抽象类接口

public abstract class Computer {
    protected ComputerBrand brand;

    public Computer(ComputerBrand brand) {
        this.brand = brand;
    }

    public abstract void on(){
        brand.on();
    }

    public abstract void off(){
        brand.off();
    }
}

台式电脑实现类

public class DesktopComputer extends Computer{
    
    public DesktopComputer(ComputerBrand brand) {
        super(brand);
    }

    @Override
    public abstract void on(){
        System.out.println("台式电脑");
        super.on();
    }

    @Override
    public abstract void off(){
        System.out.println("台式电脑");
        super.off();
    }
}

笔记本电脑实现类

public class LaptopComputer extends Computer{
    
    public LaptopComputer(ComputerBrand brand) {
        super(brand);
    }

    @Override
    public abstract void on(){
        System.out.println("笔记本电脑");
        super.on();
    }

    @Override
    public abstract void off(){
        System.out.println("笔记本电脑");
        super.off();
    }
}

客户类

// 测试客户端
public class ComputerClient{
    public static void main(String[] args) {
        Computer computer1 = new DesktopComputer(new Lenovo());
        computer1.on();  // 台式电脑,联想品牌电脑开机
        computer1.off(); // 台式电脑,联想品牌电脑关机

        Computer computer2 = new LaptopComputer(new Dell());
        computer2.on();  // 笔记本电脑,戴尔品牌电脑开机
        computer2.off(); // 笔记本电脑,戴尔品牌电脑关机
    }
}

5.优点好处

  • 提高了系统的灵活性,有助于系统进行分层设计,从而产生更好的结构化系统。
  • 提高了系统的可扩展性,增加新的模块不需要修改原有的系统,符合开闭原则。
  • 降低了系统的管理和维护成本,可以极大的减少子类的个数,实现很好的复用。

6.缺点弊端

  • 桥接模式增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,所以要求开发者针对抽象进行设计和编程。
  • 桥接模式要求开发者必须能够正确识别出系统中具有这种两个或以上维度变化的场景,所以使用范围有一定的局限性。

7.应用场景

  • 当系统中存在多层继承结构或者多维度变化场景的时候使用。
  • 当系统需要进行日志管理的时候使用,因为日志按类型可以分为登录日志和操作日志,按位置类型可以分为本地日志和异地日志,所以有两个维度。
  • 当系统需要进行消息管理的时候使用,因为消息按发送方式可以分为短信消息和邮件消息,按业务类型可以分为普通消息和特定消息,所以有两个维度。

8.应用示例

JDBC源码中的获取数据库连接对象

这里的Connection类就相当于实现类接口,而DriverManager类就相当于具体的抽象类(充当桥的作用)

通过DriverManager类中的getConnection方法,我们可以获取到相应类型的数据库连接对象

Connection接口下面又有很多具体的实现子类

以上是关于设计模式之桥接模式的主要内容,如果未能解决你的问题,请参考以下文章

php设计模式之桥接模式实例代码

设计模式之桥接模式

设计模式之桥接模式应用例题

设计模式之桥接模式 Bridge

设计模式之桥接模式

Java二十三设计模式之-----桥接模式