设计模式:桥接模式

2023-09-17 16:09:34


桥接模式是一种软件设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。该模式通过创建一个桥接接口,将抽象类和实现类连接起来,从而使它们可以独立地进行修改和扩展。桥接模式可以提高系统的灵活性和可扩展性,同时也有助于简化系统的设计。

组成部分

桥接模式的各个组成部分包括:

  1. 抽象部分(Abstraction):定义抽象部分的接口,通常是一个抽象类,并包含对实现部分的引用。

  2. 实现部分(Implementation):定义实现部分的接口,通常是一个接口或抽象类。

  3. 具体的抽象部分(Refined Abstraction):继承抽象部分并扩展其功能。

  4. 具体的实现部分(Concrete Implementation):实现实现部分的接口。

在桥接模式中,抽象部分和实现部分通过桥接接口连接在一起。抽象部分通过委托实现部分的方法来完成具体的操作。这种分离使得抽象部分和实现部分可以独立地变化和扩展,从而提高了系统的灵活性和可扩展性。

代码实现

interface DrawAPI {
    public void drawCircle(int radius, int x, int y);
}
 // 实现部分的具体实现类
class RedCircle implements DrawAPI {
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: red, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}
 class GreenCircle implements DrawAPI {
    public void drawCircle(int radius, int x, int y) {
        System.out.println("Drawing Circle[ color: green, radius: " + radius + ", x: " + x + ", y: " + y + "]");
    }
}
 // 定义抽象部分的接口
abstract class Shape {
    protected DrawAPI drawAPI;
     protected Shape(DrawAPI drawAPI){
        this.drawAPI = drawAPI;
    }
     public abstract void draw();
}
 // 抽象部分的具体实现类
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;
    }
     public void draw() {
        drawAPI.drawCircle(radius,x,y);
    }
}
 // 测试代码
public class BridgePatternDemo {
    public static void main(String[] args) {
        Shape redCircle = new Circle(100,100, 10, new RedCircle());
        Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
         redCircle.draw();
        greenCircle.draw();
    }
}

在这个示例中,我们定义了一个 DrawAPI 接口,表示实现部分的接口,然后定义了两个具体的实现类 RedCircle 和 GreenCircle 。接着,我们定义了一个 Shape 抽象类,表示抽象部分的接口,其中包含一个 DrawAPI 类型的成员变量。最后,我们定义了一个 Circle 类,表示抽象部分的具体实现类,它继承自 Shape 类,并在 draw 方法中调用 DrawAPI 接口的 drawCircle 方法。

在 BridgePatternDemo 类中,我们创建了一个 RedCircle 对象和一个 GreenCircle 对象,并调用它们的 draw 方法来绘制圆形。这里需要注意的是,我们可以在运行时动态地切换实现部分的具体实现类,从而实现更灵活的系统设计。

优缺点

桥接模式的优点:

  • 分离抽象和实现部分,使它们可以独立地变化。这样可以增加系统的灵活性和可扩展性。
  • 通过桥接接口,可以动态地切换和组合不同的抽象部分和实现部分,从而实现更灵活的系统设计。
  • 桥接模式可以提高代码的可读性和可维护性,使系统更易于理解和修改。

桥接模式的缺点:

  • 桥接模式需要额外的抽象部分和实现部分的接口和类,增加了系统的复杂性。
  • 如果抽象部分和实现部分的变化不频繁,或者系统规模较小,使用桥接模式可能会显得过于繁琐和复杂。

总结

桥接模式通过将抽象部分和实现部分分离,提高了系统的灵活性和可扩展性。它可以帮助我们设计出更灵活、可维护和可扩展的系统。然而,使用桥接模式也需要权衡其引入的复杂性和额外的代码开销。

更多推荐

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而,在研究中发现并继续探索的最令人惊讶的事情是,欺骗当前的网络安全防御是多么容易。防病毒程序建立在庞大的签名数据库之上,只需更改程序内的文本这样简单的操作就很容易崩溃。这同样适用于网络签名以及端点检测和响应。防御技术主要关注某些行

区块链安全,哈希函数暴露的攻击向量与对策

区块链安全,哈希函数暴露的攻击向量与对策简介LengthExtensionAttack是一种与某些特定类型的哈希函数(如MD5,SHA-1和SHA-2)的特性有关的攻击。简单来说,这种攻击利用了一个事实,即知道H(message)和message的长度,我们可以轻松计算出H(message||padding||exte

QTday3

#include"widget.h"Widget::Widget(QWidget*parent):QWidget(parent){this->setFixedSize(600,450);//将窗口固定大小this->setWindowIcon(QIcon(":/wodepeizhenshi.png"));//设置窗口图

驱动开发---基于gpio子系统编写LED灯的驱动

一、GPIO子系统相关API1.解析GPIO相关的设备树节点structdevice_node*of_find_node_by_path(constchar*path)功能:根据设备树节点路径解析设备树节点信息参数:path:设备树所在的节点路径/mynode@0X12345678返回值:成功返回目标节点首地址,失败返

第33节——useRef

一、概念useRef,他的作用是“勾住”某些组件挂载完成或重新渲染完成后才拥有的某些对象,并返回该对象的引用。该引用在组件整个生命周期中都固定不变,该引用并不会随着组件重新渲染而失效。返回一个可变的ref对象,该对象只有个current属性,初始值为传入的参数(initialValue)。返回的ref对象在组件的整个生

【ROS】机器人使用Nomachine进行远程控制

官网:NoMachine-FreeRemoteDesktopforEverybody支持的系统:WindowsMacLinux树莓派其他ARM板IOSAndroid由于网速问题,可以使用我下载好的:(8.8.1_1)链接:https://pan.baidu.com/s/16v6jn8a-dcVbIxGI3bI2QA提取

60+开源数据集资源大合集(医学图像、卫星图像、语义分割、自动驾驶、图像分类等)

1.医学图像疟疾细胞图像数据集下载链接:http://suo.nz/2VQTUt皮肤癌MNIST:HAM10000下载链接:http://suo.nz/33n6Xy该数据集收集了来自不同人群的皮肤镜图像,通过不同的方式获取和存储。最终数据集包含10015张皮肤镜图像,可用作学术机器学习目的的训练集。案例包括色素病变领域

记一次 Java Testcontainers CPU 100% 问题排查过程

以为代码进入了死循环,结果并没有!文章目录背景与问题排查过程代码路经确认内存分析咨询okio社区等等,好像并没有死循环能否从内存快照发现其他问题?背景与问题本问题来源于ShardingSphereissue:Integrationtestsoccasionallystuckinwaitingforcontainerre

C++之template可变模板参数应用总结(二百二十八)

简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.更多原创,欢迎关注:Android系统攻城狮1.前言本篇目的:C++之

步步为营,如何将GOlang引用库的安全漏洞修干净

文章目录引场景构建第一步、直接引用的第三方库升级修复策略1.确认是否为直接引用的第三方库2.找到需要升级的版本是否为release版本第二步、间接引用的第三方库升级修复策略那么问题来了,我们这么间接引用库的对应的直接引用库是哪个呢?(一)没有release版本,但直接引用库有最新的代码可升级(1)将最新代码下载到项目某

Redis 集合(Set)快速指南 | Navicat

Redis支持通过多种数据类型来存储项目集合。其中,包括列表、集合和哈希。上周的博文介绍了列表(List)数据类型并重点介绍了一些用于管理列表(List)的主要命令。在今天的文章中,我们将转向关注集合(Set)数据类型。在Redis中,集合(Set)与列表(List)相似,但是,集合(Set)中的元素是无序的,并且每个

热文推荐