Bridge 桥接

news2024/11/19 5:36:29

意图

将抽象部分与其显示部分分离,使他们都可以独立地变化。

结构

其中:

  • Abstraction定义抽象类的接口,维护一个指向Implementer类型对象的指针。
  • RefinedAbstraction扩展由Abstraction定义的接口。
  • Implementor定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同,一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
  • ConcreteImplementor实现Implementor接口并定义他的具体实现

适用性

  • 不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  • 累的抽象以及他的实现都有该可以通过生成子类的方法来加以扩充。这是Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译,(C++)相对客户完全隐藏抽象的实现部分。
  • 许多类需要生成的层次结构。
  • 想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。

代码示例

桥接设计模式是一种结构型设计模式,它将抽象部分与实现部分分离,从而使两者可以独立变化。

假设我们有一个 Shape 抽象类,它定义了形状的基本操作。我们还有两个实现类 Circle 和 Square,它们提供了具体形状的实现。

我们希望能够在不修改 Shape 抽象类的情况下向系统添加新的形状。

// 抽象形状类
abstract class Shape {

    protected DrawAPI drawAPI;

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

    public abstract void draw();
}

// 圆形类
class Circle extends Shape {

    public Circle(DrawAPI drawAPI) {
        super(drawAPI);
    }

    @Override
    public void draw() {
        drawAPI.drawCircle();
    }
}

// 正方形类
class Square extends Shape {

    public Square(DrawAPI drawAPI) {
        super(drawAPI);
    }

    @Override
    public void draw() {
        drawAPI.drawSquare();
    }
}

// 绘制 API 接口
interface DrawAPI {

    void drawCircle();
    void drawSquare();
}

// 红色绘制 API 实现
class RedDrawAPI implements DrawAPI {

    @Override
    public void drawCircle() {
        System.out.println("使用红色绘制圆形");
    }

    @Override
    public void drawSquare() {
        System.out.println("使用红色绘制正方形");
    }
}

// 绿色绘制 API 实现
class GreenDrawAPI implements DrawAPI {

    @Override
    public void drawCircle() {
        System.out.println("使用绿色绘制圆形");
    }

    @Override
    public void drawSquare() {
        System.out.println("使用绿色绘制正方形");
    }
}

// 客户端代码
public class Client {

    public static void main(String[] args) {
        DrawAPI redDrawAPI = new RedDrawAPI();
        DrawAPI greenDrawAPI = new GreenDrawAPI();

        Shape redCircle = new Circle(redDrawAPI);
        Shape greenSquare = new Square(greenDrawAPI);

        redCircle.draw();
        greenSquare.draw();
    }
}
  • Shape 是一个抽象类,定义了形状的基本操作。
  • Circle 和 Square 是实现类,它们提供了具体形状的实现。
  • DrawAPI 是一个接口,定义了绘制形状所需的接口。
  • RedDrawAPI 和 GreenDrawAPI 是 DrawAPI 接口的实现,它们提供了使用不同颜色的绘制功能。
  • 客户端代码通过将 Shape 对象与 DrawAPI 对象关联来创建不同的形状和颜色组合。

桥接模式将抽象部分(Shape)与实现部分(DrawAPI)分离,从而使两者可以独立变化。我们可以轻松地添加新的形状或绘制 API 实现,而无需修改其他部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1594334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年DTC的回顾与思考

刚结束了2024的数据库技术嘉年华 这是我从2017年开始就参加的技术大会。中途因为疫情的耽误。正常来说我是连续的。知道我的朋友都知道我习惯炫耀一下。 按照惯例,此时此刻群友都在写大会回顾。只是有几个不讲武德的人已经发送了。下面有主观和客观的分析。 主观上…

亚马逊云科技CTO带你学习云计算降本增效秘诀

2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote,这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要? ▶️企业基础设施投入大,利用好降本策略可以减少巨…

记录linux从0部署java项目(宝塔)

目录 一、安装宝塔可视化界面 二、部署前端 三、部署后端 1、配置并连接Mysql数据库 2、配置并连接redis 3、安装jdk 这里先记录一个安装后遇到的问题 安装openJDK 四、检查 一、安装宝塔可视化界面 宝塔面板下载,免费全能的服务器运维软件 运行安装脚本 安…

步骤大全:网站建设3个基本流程详解

一.领取一个免费域名和SSL证书,和CDN 1.打开网站链接:https://www.rainyun.com/z22_ 2.在网站主页上,您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册",然后选择"微信登录"选项。 4.使用您的…

时间序列模型:lag-Llama

项目地址:GitHub - time-series-foundation-models/lag-llama: Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting 论文地址:https://arxiv.org/pdf/2310.08278.pdf hugging-face镜像:https://hf-mirror.c…

C++11 设计模式2. 简单工厂模式

简单工厂(Simple Factory)模式 我们从实际例子出发,来看在什么情况下,应用简单工厂模式。 还是以一个游戏举例 //策划:亡灵类怪物,元素类怪物,机械类怪物:都有生命值&#xff0…

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode) 核心考点:数组相关,特性观察,时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程,谁排除…

傲基科技冲刺上市:依赖单一产品,元气未恢复,有股东提前退出

近日,傲基科技股份有限公司(下称“傲基科技”)递交招股书,准备在港交所主板上市,华泰证券为其独家保荐人。 据招股书介绍,傲基科技是一家提供家具家居类产品的品牌运营商及出口物流服务商。傲基科技在招股…

进程与线程的区别?

并发和并行 在聊进程和线程的概念之前,首先了解一下操作系统相关概念,大部分操作系统(如Windos、Linux)的任务调度是采用时间片轮转的抢占式调度方式,也就是一个任务执行一小段时间后强制暂停去执行下一个任务&#x…

音频变速python版

音频变速 如何能在不改变音频其他特点的情况下,只改变语速呢? 有几个python的库可以实现该功能,下面一一介绍。 pydub库 首先,确保安装了pydub和ffmpeg。 下面是一个简单的Python脚本,展示如何改变音频的播放速度&a…

通讯录的实现(顺序表版本)

我们知道通讯录是基于顺序表的前提下,要写好通讯录我们就要深入了解好顺序表。我们先来看看什么是顺序表。(注意今天代码量有点多,坚持一下)。冲啊!兄弟们! 顺序表的简单理解 对于顺序表,我们首…

地球上的七大洲介绍

地球上的七大洲示意图: 1. 亚洲(Asia):世界上最大的洲,面积约为44579000平方公里。亚洲地域辽阔,包括从北极圈到赤道的各种气候和地形。它拥有世界上最多的人口,也是世界上一些最古老文明的发源…

2024年腾讯云最新优惠活动及领券入口整理分享

随着云计算技术的快速发展,越来越多的企业和个人选择将业务部署在云端。腾讯云作为国内知名的云计算服务提供商,为用户提供了丰富的云产品和服务。为了帮助用户降低成本,腾讯云定期推出各种优惠活动。本文将为大家整理分享2024年腾讯云的最新…

1.MMD模型动作场景镜头的导入及视频导出

界面介绍 MIKUMIKUDANCE926版本 MMD的工具栏模型骨骼帧的窗口,在不同时间做不同动作,可以在这里打帧操作时间曲线操作窗口,控制模型两个动作之间的过渡模型操作窗口,导入模型选择模型相机操作,控制相机远近&#xf…

JS/TS笔记学习2

周末总得学点什么吧~ 奥利给! 设计模式: 事件订阅派发模式 简单说就是:事件调度中心,负责接收事件发布者的消息,并将这些消息分发给所有订阅了该事件的订阅者 为什么用它,在构建大型、复杂或交互性强的应用程序时,用该模式非常方便&#xff0…

至少需要[XXXXMB]内存才能安装(宝塔导入数据库提示)

①我的2g内存腾讯云服务器想安装mysql8.0 ②宝塔提示“至少需要[3700MB]内存才能安装” 将数据库部署到宝塔上的时候提示-----》至少需要[XXXXMB]内存才能安装,解决的方法其实也很简单。 首先,进入文件夹/www/server/panel/class,找到找到…

OpenSSH 安全漏洞(CVE-2023-51385) 升级v9.7

漏洞编号:OpenSSH 安全漏洞(CVE-2023-51385) openssh9.7文件获取 https://f.ws59.cn/f/dtv9atef3io 复制链接到浏览器打开 处理方式 ##注释掉的根据实际情况处理 #查询原openssh9.4p1是否有安装openssh-askpass,若有需先删除 rpm -qa | grep openss…

解决Xshell登录云服务器的免密码和云服务器生成子用户问题

Xshell登录云服务器的免密码问题 前言一、Xshell登录云服务器的免密码操作实践 二、centos创建用户创建用户实操删除用户更改用户密码直接删除子用户 前言 Xshell登录云服务器免密码问题的解决方案通常涉及使用SSH密钥对。用户生成一对密钥(公钥和私钥)…

PE程序底层结构与恶意代码插入与执行的研究

Windows PE程序底层结构分析 PE(Portable Executable)是一种Windows操作系统下可执行文件的标准格式 Windows PE程序结构和Linux的elf程序结构类似,首先一个名为simple64.exe程序里有一个头文件和一个段文件,头文件里主要存放的是…

【STL】priority_queue的底层原理及其实现

文章目录 priority_queue的介绍库中priority_queue的使用什么叫仿函数? 模拟实现prioprity_queue类 priority_queue的介绍 解释以上内容 priority_queue(优先级队列)跟stack、queue一样,都是一种容器适配器,根据严格的…