设计模式-桥接模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

[(1) 优点](#(1) 优点)

[(2) 缺点](#(2) 缺点)

模式结构

具体实现

实际应用


定义

桥接(Bridge)模式的定义:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

特点

将抽象部分与实现部分分离,使它们都可以独立的变化。

使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。

举例:包包按用途划分:背包、钱包等;按颜色划分:红色、黑色等,组合不同的种类=2 * 2

  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。
因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在 设计模式中,有一个原则为优先使用组合/聚合,而不是继承。
不同的两个维度组合=m * n

优缺点

(1) 优点
  • 抽象和实现的分离。
  • 优秀的扩展能力。
  • 实现细节对客户透明
(2) 缺点
  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

模式结构

可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。

桥接(Bridge)模式包含以下主要角色。

  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

具体实现

实现化接口和具体实现类

复制代码
/**
 * 绘制接口
 */
public interface DrawAPI {
   /**
    * 绘制圆形
    * @param radius 半径
    * @param x x轴
    * @param y y轴
    */
   void drawCircle(int radius, int x, int y);
}

/**
 * 蓝色的绘制器
 */
public class DrawBlueImpl implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: blue, radius: "
                + radius + ", x: " + x + ", " + y + "]");
    }
}

/**
 * 红色的绘制器
 */
public class DrawRedImpl implements DrawAPI {
    @Override
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: red, radius: "
                + radius + ", x: " + x + ", " + y + "]");
    }
}

抽象化和实现类

复制代码
/**
 * 形状
 */
public abstract class Shape {
    protected DrawAPI drawAPI;

    public Shape(DrawAPI drawAPI) {
        this.drawAPI = drawAPI;
    }

    /**
     * 绘制的抽象接口
     */
    protected abstract void draw();
}

/**
 * 圆形
 */
public class Circle extends Shape {

    private int x, y, radius;

    public Circle(int x, int y, int radius, DrawAPI drawAPI) {
        super(drawAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    protected void draw() {
        drawAPI.drawCircle(radius, x, y);
    }
}

具体使用

复制代码
public class App {
    public static void main(String[] args) {
        Shape redCircle = new Circle(100,100, 50, new DrawRedImpl());
        redCircle.draw();

        Shape blueCircle = new Circle(100,100, 50, new DrawBlueImpl());
        blueCircle.draw();
    }
}

实际应用

1、jdbc(java数据库连接)

相关推荐
普通网友2 分钟前
【python】pyspark.errors.exceptions.base.PySparkRuntimeError [JAVA_GATEWAY_EXITED] Java gateway proce
java·python·gateway
许彰午8 小时前
14_Java泛型完全指南
java·windows·python
智慧物业老杨9 小时前
司法绿色通道下的物业纠纷数智化解决方案——基于“三优先“机制的全流程技术落地实践
java·django
2601_961194029 小时前
2026初级会计实务公式总结大全|计算题公式手册PDF
java·spring·eclipse·pdf·tomcat·hibernate
做个文艺程序员9 小时前
第1篇:K8s 核心概念精讲:Pod、Deployment、Service 与 Namespace——Java 开发者快速上手指南
java·云原生·容器·kubernetes·容器编排
小欣加油11 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
闪电悠米12 小时前
黑马点评-Redisson-01_why_redisson
java·服务器·网络·数据库·缓存·wpf
星轨zb12 小时前
LangChain4j 集成 Spring Boot:会话记忆 NPE 的根源与 ChatMemoryProvider 正确配置
java·spring boot·后端·langchain4j
JAVA96512 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
JAVA面经实录91712 小时前
RocketMQ全套学习知识手册
java·kafka·rabbitmq·rocketmq