设计模式—桥接模式

桥接模式

桥梁模式(Bridge Pattern) 也叫做桥接模式, 是一个比较简单的模式 。

桥接模式是一种结构模式。桥接模式遵循了里氏替换原则依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放 。

定义:将抽象和实现解耦, 使得两者可以独立地变化。

主要特点:将抽象与行为实现分离开,从而保持各部分的独立性以及应为他们的功能扩展。

桥接模式连接两边,分别是类的功能层次结构类的实现层次结构

优点

  • 抽象和实现分离 。
  • 优秀的扩充能力 。
  • 实现细节对客户透明 。客户不用关心细节的实现, 它已经由抽象层通过聚合关系完成了封装。

使用场景

  • 不希望或不适用使用继承的场景 。例如继承层次过渡、 无法更细化设计颗粒等场景, 需要考虑使用桥梁模式。
  • 接口或抽象类不稳定的场景。明知道接口不稳定还想通过实现或继承来实现业务需求, 那是得不偿失的, 也是比较失败的做法。
  • 重用性要求较高的场景 。

注意事项

桥梁模式是非常简单的, 使用该模式时主要考虑如何拆分抽象和实现, 并不是一涉及继承就要考虑使用该模式, 那还要继承干什么呢? 桥梁模式的意图还是对变化的封装, 尽量把可能变化的因素封装到最细、 最小的逻辑单元中, 避免风险扩散。 因此读者在进行系统设计时, 发现类的继承有N层时, 可以考虑使用桥梁模式。

案例分析

类的实现层次结构

  • 定义实现角色的接口
public interface Brand {
    void open();
    void close();
    void call();
}
  • 定义具体实现话角色1
public class Vivo implements Brand {
    @Override
    public void open() {
        System.out.println("Vivo手机开机");
    }

    @Override
    public void close() {
        System.out.println("Vivo手机关机");
    }

    @Override
    public void call() {
        System.out.println("Vivo手机打电话");
    }
}
  • 定义具体实现话角色2
public class XiaoMi implements Brand {
    @Override
    public void open() {
        System.out.println("小米手机开机");
    }

    @Override
    public void close() {
        System.out.println("小米手机关机");
    }

    @Override
    public void call() {
        System.out.println("小米手机打电话");
    }
}

类的功能层次结构

  • 定义抽象化角色
public abstract class Phone {
    private Brand brand;

    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

    protected void open() {
        brand.open();
    }

    protected void close() {
        brand.close();
    }

    protected void call() {
        brand.call();
    }
}
  • 定义扩展抽象化角色
public class FoldedPhone extends Phone {
    public FoldedPhone(Brand brand) {
        super(brand);
    }

    @Override
    public void open() {
        super.open();
        System.out.println("折叠样式手机");
    }

    @Override
    public void close() {
        super.close();
        System.out.println("折叠样式手机");
    }

    @Override
    public void call() {
        super.call();
        System.out.println("折叠样式手机");
    }
}
  • 定义客户端测试
public class Client {
    public static void main(String[] args) {
        FoldedPhone phone = new FoldedPhone(new XiaoMi());
        phone.open();
        phone.close();
        phone.call();

        System.out.println();
        FoldedPhone phone1 = new FoldedPhone(new Vivo());
        phone1.open();
        phone1.close();
        phone1.call();
    }
}

输出:

小米手机开机
折叠样式手机
小米手机关机
折叠样式手机
小米手机打电话
折叠样式手机

Vivo手机开机
折叠样式手机
Vivo手机关机
折叠样式手机
Vivo手机打电话
折叠样式手机

Process finished with exit code 0

posted @   弘一  阅读(20)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示