设计模式-桥接模式

作者持续关注 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数据库连接)

相关推荐
吾日三省吾码4 小时前
JVM 性能调优
java
弗拉唐5 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
oi776 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
少说多做3436 小时前
Android 不同情况下使用 runOnUiThread
android·java
知兀6 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑20206 小时前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深6 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
shuangrenlong7 小时前
slice介绍slice查看器
java·ubuntu
牧竹子7 小时前
对原jar包解压后修改原class文件后重新打包为jar
java·jar