设计模式之桥接模式

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接口下面又有很多具体的实现子类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程小吉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值