设计模式-桥接模式

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

相关推荐
黑胡子大叔的小屋14 分钟前
基于springboot的海洋知识服务平台的设计与实现
java·spring boot·毕业设计
ThisIsClark16 分钟前
【后端面试总结】深入解析进程和线程的区别
java·jvm·面试
雷神乐乐1 小时前
Spring学习(一)——Sping-XML
java·学习·spring
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
V+zmm101342 小时前
基于小程序宿舍报修系统的设计与实现ssm+论文源码调试讲解
java·小程序·毕业设计·mvc·ssm
文大。2 小时前
2024年广西职工职业技能大赛-Spring
java·spring·网络安全
一只小小翠2 小时前
EasyExcel 模板+公式填充
java·easyexcel
m0_748256343 小时前
QWebChannel实现与JS的交互
java·javascript·交互
Jelena技术达人3 小时前
Java爬虫获取1688关键字 item_search接口返回值详细解析
java·开发语言·爬虫
u0107735143 小时前
【字符串】-Lc5-最长回文子串(中心扩展法)
java·算法