设计模式之桥接模式

桥接模式

文章目录

定义

桥接模式(Bridge Pattern),是一个比较简单的模式,其定义如下:

Decouple an abstraction from its implementation so that the two can vary independently.(将抽象和实现解耦,使得两者可以独立地变化。)

桥接模式4个角色

  • Abstraction 抽象化角色

    它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类

  • Implementor 实现化角色 它是接口或者抽象类,定义角色必须的行为和属性

  • RefinedAbstraction 修正抽象化角色 它引用实现化角色对抽象化角色进行修正

  • ConcreteImplementor 具体实现化角色 它实现接口或抽象类定义的方法和属性

桥接模式中的几个名词比较拗口,大家只要记住一句话就成:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色完成的。

优缺点

优点
  • 抽象和实现分离

    它完全是为了解决继承的缺点而提出的设计模式。在该模式下,实现可以不受抽象的约束,不用再绑定在一个固定的抽象层次上。

  • 优秀的扩充能力

    想增加抽象,也没有问题!只要对外暴露的接口层允许这样的变化,我们已经把变化的可能性减到最小。

  • 实现细节对客户透明

    客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装。

缺点

示例代码

  1. 定义接口
java 复制代码
public interface Implementor {
    // 基本方法
    void doSomething();

    void doAnything();
}
  1. 定义抽象类
java 复制代码
public abstract class Abstraction {
    // 定义对实现化角色的引用
    private Implementor implementor;

    // 约束子类必须实现该构造函数
    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    // 自身的行为和属性
    public void request() {
        this.implementor.doSomething();
    }

    public Implementor getImplementor() {
        return implementor;
    }
}
  1. 具体实现类
java 复制代码
public class ConcreteImplementor1 implements Implementor {
    @Override
    public void doSomething() {
        // TODO 业务逻辑处理
    }

    @Override
    public void doAnything() {
        // TODO 业务逻辑处理
    }
}
java 复制代码
public class ConcreteImplementor2 implements Implementor {
    @Override
    public void doSomething() {
        // TODO 业务逻辑处理
    }

    @Override
    public void doAnything() {
        // TODO 业务逻辑处理
    }
}
java 复制代码
public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    @Override
    public void request() {
        super.request();
        super.getImplementor().doAnything();
    }
}
  1. 测试类
java 复制代码
@Test
public void test() {
    // 定义一个实现化角色
    Implementor imp = new ConcreteImplementor1();
    // 定义一个抽象化角色
    Abstraction abs = new RefinedAbstraction(imp);
    // 执行行文
    abs.request();
}
相关推荐
董世昌411 天前
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
java·前端
好度1 天前
配置java标准环境?(详细教程)
java·开发语言
teacher伟大光荣且正确1 天前
关于Qt QReadWriteLock(读写锁) 以及 QSettings 使用的问题
java·数据库·qt
nightseventhunit1 天前
base64字符串String.getByte导致OOM Requested array size exceeds VM limit
java·oom
悟能不能悟1 天前
java map判断是否有key,get(key)+x,否则put(key,x)的新写法
java·开发语言
webbodys1 天前
Python文件操作与异常处理:构建健壮的应用程序
java·服务器·python
石工记1 天前
对称加密 vs 非对称加密图解详解
java·网络安全
不急不躁1231 天前
Android16 给应用默认获取权限
android·java
C雨后彩虹1 天前
5G网络建设
java·数据结构·算法·华为·面试
码界奇点1 天前
基于Spring Boot的后台管理系统设计与实现
java·spring boot·后端·车载系统·毕业设计·源代码管理