设计模式-桥接模式

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

相关推荐
向阳12186 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study16 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
WaaTong39 分钟前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_7430484439 分钟前
初识Java EE和Spring Boot
java·java-ee
AskHarries41 分钟前
Java字节码增强库ByteBuddy
java·后端
霁月风42 分钟前
设计模式——观察者模式
c++·观察者模式·设计模式
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭1 小时前
Java中的动态代理
java·开发语言·aop·动态代理
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林2 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac