桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录

  • 一、引言
  • 二、应用场景与技术背景
  • 三、模式定义与实现
  • 四、实例详解
  • 五、优缺点分析
  • 总结:

一、引言

​ 桥接模式是一种结构型设计模式,它将抽象部分与它的实现部分分离,使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构,并使用组合而非继承来关联这两层,从而使得系统在面对多维度变化时,能够保持较低的耦合度,支持灵活扩展。

二、应用场景与技术背景

桥接模式适用于以下场景:

  1. 系统需要在多个维度上进行扩展,而这些维度的变化是相互独立的。
  2. 不希望使用继承来实现组件间的组合,因为这会导致类爆炸或过度耦合。

例如,在图形用户界面(GUI)库中,窗口有多种外观(如Windows风格、Mac风格),同时又有多种操作(如打开、关闭、最大化等)。桥接模式可以帮助我们将窗口外观和窗口操作这两个独立变化的维度进行解耦,让每种外观都能轻松搭配不同的操作实现。

三、模式定义与实现

桥接模式的核心组成部分包括:

在这里插入图片描述

  1. Abstraction(抽象化角色):定义抽象接口,维持一个指向Implementor对象的引用。
  2. RefinedAbstraction(具体抽象化角色):是Abstraction接口的一个实现,负责调用Implementor对象的方法并提供额外的功能。
  3. Implementor(实现化角色):定义实现化角色的接口,供Abstraction角色调用。
  4. ConcreteImplementor(具体实现化角色):实现了Implementor接口,提供了具体的实现。

四、实例详解

以打印机系统为例,品牌属于抽象实现,彩色打印、黑白打印 属于具体实现。

  1. 定义抽象化角色(Abstraction):首先创建一个表示打印机的抽象类Printer,该类包含一个指向打印技术实现对象的引用,并声明了print()方法。
public abstract class Printer {protected PrintTechnology technology;public void setPrintTechnology(PrintTechnology technology) {this.technology = technology;}// 抽象方法,由子类具体实现public abstract void print();
}
  1. 定义具体抽象化角色(Refined Abstraction):创建具体的打印机品牌如HPPrinter作为Printer的子类,它实现了print()方法,在调用打印功能时,会委托给关联的打印技术对象执行实际打印操作。
public class HPPrinter extends Printer {@Overridepublic void print() {System.out.println("HP 打印机开始工作");technology.print(); // 调用实现化角色的方法}
}
  1. 定义实现化角色接口(Implementor):创建一个表示打印技术的接口PrintTechnology,声明了print()方法,为各种不同的打印技术提供统一的接口。
public interface PrintTechnology {void print();
}
  1. 定义具体实现化角色(Concrete Implementor):分别创建两种具体的打印技术实现类,如BlackAndWhitePrintTechnologyColorPrintTechnology,它们都实现了PrintTechnology接口,提供了黑白打印和彩色打印的具体实现。
public class BlackAndWhitePrintTechnology implements PrintTechnology {@Overridepublic void print() {System.out.println("正在进行黑白打印...");}
}public class ColorPrintTechnology implements PrintTechnology {@Overridepublic void print() {System.out.println("正在进行彩色打印...");}
}
  1. 应用端使用:在应用程序中,根据需求动态组合不同的打印机品牌与打印技术。例如,可以创建一个HP品牌的打印机并设置其打印技术为黑白或彩色。
public class BridgePatternDemo {public static void main(String[] args) {Printer hpPrinter = new HPPrinter();// 设置打印技术为黑白打印hpPrinter.setPrintTechnology(new BlackAndWhitePrintTechnology());hpPrinter.print(); // 输出:HP 打印机开始工作\n正在进行黑白打印...System.out.println("===================");// 更改为彩色打印技术hpPrinter.setPrintTechnology(new ColorPrintTechnology());hpPrinter.print(); // 输出:HP 打印机开始工作\n正在进行彩色打印...}
}

测试结果

在这里插入图片描述

​ 通过以上步骤,桥接模式成功地将打印机的品牌(抽象化角色)与其支持的打印技术(实现化角色)解耦合,使得二者可以独立扩展而互不影响。在实际运行时,可以根据需要灵活配置打印机的品牌和打印技术,实现不同维度的组合变化。

五、优缺点分析

优点:

  1. 降低耦合:通过将抽象与实现分离,消除了抽象与实现之间的静态绑定关系,使得两者可以独立改变而不影响对方。
  2. 提高灵活性:新增或修改抽象化角色和实现化角色的子类时,不会对其他子类造成影响,增强了系统的可扩展性。

潜在挑战:

  1. 复杂性增加:引入了更多的类和层次结构,可能增加理解与维护成本。
  2. 过度设计风险:如果需求中不存在独立变化的维度,强行使用桥接模式可能导致设计过于复杂。

总结:

​ 桥接模式通过分离抽象与实现,为系统提供了更加灵活的设计结构,使得系统可以在多个维度上自由扩展。在实际应用中,合理运用桥接模式能有效解决因继承带来的紧耦合问题,提升代码的复用性和可维护性,尤其适用于那些需要应对多维度变化需求的软件设计。然而,也应注意避免在简单系统中过度设计,确保模式的应用符合实际需求和场景特点。

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

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

相关文章

io进程线程第七天

1.使用消息队列完成两个进程之间的通信 程序A代码&#xff1a; #include <myhead.h> struct msgbuf {long mtype;char mtext[1024]; }; //定义一个宏&#xff0c;表示消息正文内容的大小 #define MSGSIZE sizeof(struct msgbuf)-sizeof(long)int main(int argc, const c…

目标检测-Transformer-ViT和DETR

文章目录 前言一、ViT应用和结论结构及创新点 二、DETR应用和结论结构及创新点 总结 前言 随着Transformer爆火以来&#xff0c;NLP领域迎来了大模型时代&#xff0c;成为AI目前最先进和火爆的领域&#xff0c;介于Transformer的先进性&#xff0c;基于Transformer架构的CV模型…

Devvortex

目标靶机 攻击机IP地址为10.10.16.2 信息收集 # nmap -sT --min-rate 10000 -p- 10.10.11.242 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-21 10:32 CST Warning: 10.10.11.242 giving up on port because retransmission cap hit (10). Nma…

第三方支付机构最新“POS”机刷卡费用公式

多家支付机构发布了最新的刷卡费用公示。 《非银行支付机构监督管理条例》(简称《条例》)由国务院发布&#xff0c;明确规定非银行支付机构须按照相关价格法律、行政法规的规定&#xff0c;合理确定并公开支付业务的收费项目和收费标准&#xff0c;以明码标价。 支付行业在春节…

Shell的运行原理以及Linux当中的权限问题

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Liunx从入门到精通 &#x1f69a;代码仓库&#xff1a;小…

k8s(2)

目录 一.二进制部署k8s 常见的K8S安装部署方式&#xff1a; k8s部署 二进制与高可用的区别 二.部署k8s 初始化操作&#xff1a; 每台node安装docker&#xff1a; 在 master01 节点上操作; 准备cfssl证书生成工具:&#xff1a; 执行脚本文件&#xff1a; 拉入etcd压缩包…

国产大模型,不会开启“烧钱游戏”

最近&#xff0c;OpenAI的Sora又在科技圈投入一枚深水炸弹。全球对于大模型的关注&#xff0c;又一次达到高峰。 聚焦到国内&#xff0c;百度、科大讯飞、商汤、华为等大型企业&#xff0c;以及海量的创业小公司都在布局大模型。以往每一次风口吹来的时候&#xff0c;资本总会…

springboot网站开发02-接入持久层框架mybatisPlus

springboot网站开发02-接入持久层框架mybatisPlus&#xff01;经过上一小节内容分享&#xff0c;我们的项目嵌套模式框架搭建好了&#xff0c;下面就是开始编辑具体的业务代码了&#xff0c;我们使用到了持久层框架是mybatisPlus插件。下面是一些具体的植入框架的操作步骤。 第…

C# cass10 宗地初始化-根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层

运行环境Visual Studio 2022 c# cad2016 cass10 根据 “预编号” “权利人”图层对应信息 批量添加到宗地图层 一、主要步骤 zdimport 方法&#xff1a;这个方法用于导入宗地信息。首先通过调用 AutoCAD API 获取当前活动文档、数据库和编辑器对象。然后根据 CreatePalette.Se…

[OpenAI]继ChatGPT后发布的Sora模型原理与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

day11_内部类代码块枚举课后练习 - 参考答案

文章目录 day11_课后练习代码阅读题第1题第2题第3题第4题第5题第6题第7题第8题第9题第10题第11题第12题 代码编程题第13题 day11_课后练习 代码阅读题 第1题 知识点&#xff1a;实例初始化 案例&#xff1a;判断运行结果 package com.atguigu.test01;class HelloA{public …

稳定运行矿山鸿蒙系统——飞凌嵌入式的这2款核心板获得「矿鸿资质证书」

飞凌嵌入式FETMX6ULL-S核心板和FETA40i-C核心板近期通过了“矿鸿兼容性测试认证”&#xff0c;这两款嵌入式核心板与矿鸿OS的结合将进一步推动煤矿行业的智能化进程。 矿鸿&#xff08;MineHarmony&#xff09;操作系统是由国家能源集团基于鸿蒙系统推出的一款专为煤矿行业设计…

网页403错误(Spring Security报异常 Encoded password does not look like BCrypt)

这个错误通常表现为"403 Forbidden"或"HTTP Status 403"&#xff0c;它指的是访问资源被服务器理解但拒绝授权。换句话说&#xff0c;服务器可以理解你请求看到的页面&#xff0c;但它拒绝给你权限。 也就是说很可能测试给定的参数有问题&#xff0c;后端…

C++力扣题目 392--判断子序列 115--不同的子序列 583--两个字符串的删除操作 72--编辑操作

392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;&quo…

小说阅读软件书架界面和历史记录界面

1、引言 终于修改到书架界面和历史阅读记录界面了&#xff0c;修改完这两个界面就算完成一大半了&#xff0c;这两个界面其实都差不多&#xff0c;代码逻辑都一样&#xff0c;因此后面也会只展示书架界面的代码&#xff0c;历史阅读记录界面就展示效果图就行了。 2、实现代码 …

无线听觉新体验:南卡、韶音、墨觉骨传导耳机综合评测

作为一个资深的跑步爱好者&#xff0c;我几乎离不开音乐的陪伴。不知道大家有没有同感&#xff0c;有时候一首歌曲就是我坚持下去的动力&#xff0c;尤其是在那段艰难的跑步时刻。但是找到一款既能让我在运动中自由呼吸、又能提供优质音乐体验的耳机&#xff0c;并不是一件容易…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

人工智能 — 数字图像

目录 一、图像1、像素2、图像分辨率3、RGB 模型4、灰度5、通道6、对比度7、RGB 转化为 Gray8、RGB 值转化为浮点数9、二值化10、常用视觉库11、频率12、幅值 二、图像的取样与量化1、数字图像2、取样3、量化 三、上采样与下采样1、上采样&#xff08;upsampling&#xff09;2、…

Encoder-decoder 与Decoder-only 模型之间的使用区别

承接上文&#xff1a;Transformer Encoder-Decoer 结构回顾 笔者以huggingface T5 transformer 对encoder-decoder 模型进行了简单的回顾。 由于笔者最近使用decoder-only模型时发现&#xff0c;其使用细节和encoder-decoder有着非常大的区别&#xff1b;而huggingface的接口为…

解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue

这里写目录标题 1.运行环境2.报错信息3.解决方案4.查看解决之后的效果 1.运行环境 使用docker运行了RabbitMQ的服务器&#xff1a; 在idea中导入springAMQP的jar包&#xff0c;分别编写了子模块生产者publisher&#xff0c;消费者consumer&#xff1a; 1.在publisher中运行测试…