当前位置: 首页 > news >正文

设计模式之桥梁模式

什么是桥梁模式

桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。

桥梁模式的核心角色

桥梁模式的实现通常包括以下四个角色:

  1. Abstraction——抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
  2. Implementor——实现化角色:它是接口或者抽象类,定义角色必需的行为和属性。
  3. RefinedAbstraction——修正抽象化角色:它引用实现化角色对抽象化角色进行修正。
  4. ConcreteImplementor——具体实现化角色:它实现接口或抽象类定义的方法和属性。

桥梁模式如何实现

小王是一个富二代,家里的产业很多,开煤矿、搞房地产等等,如果设计一个程序来帮助小王来管理家族产业,那么应该怎么实现呢?这里就可以使用桥梁模式来实现。为什么可以使用桥梁模式呢?原因是这样的,小王家大业大、善于投资,这些产业可能会发生变化,比如煤矿不挣钱了,就改搞新能源;如果房地产不挣钱了,那就搞酒店住宿,可以看出来具体的业务可能会发生变化;那有没有不会发生变化的东西?当然有。这么大的产业,一般会成立一些子公司分别来管理这些产业,然后通过一个母公司来控制这些子公司。

那这里的母公司就是抽象化角色(Abstraction),子公司就是实现化角色(RefinedAbstraction),这些不同的产业可以抽象为产品类,即实现化角色(Implementor),产品有两个共同的行为,被生出来、被销售出去,煤碳、房产等这些就是具体的具体实现化角色(ConcreteImplementor),下面就用代码来演示一个这个过程:

  1. MotherCompany:抽象化母公司,属于抽象化角色(Abstraction)
  2. CoalCompany:煤炭公司袱类,属于实现化角色(RefinedAbstraction)
  3. HouseCompany:房产公司类,继承于MotherCompany,属于具体实现化角色(ConcreteImplementor)
  4. Product:抽象产品类,即实现化角色(Implementor)
  5. House:房产实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
  6. Coal,煤炭实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
/*** 抽象产品,实现化角色(Implementor)*/
public abstract class Product {/*** 被生产出来*/public abstract void  beProduted();/*** 被销售出去*/public abstract void beSelled();
}
/*** 煤炭,具体实现化角色(ConcreteImplementor)*/
public class Coal  extends Product{@Overridepublic void beProduted() {System.out.println("煤炭生产");}@Overridepublic void beSelled() {System.out.println("煤炭销售");}
}
/*** 房产,具体实现化角色(ConcreteImplementor)*/
public class House extends Product{@Overridepublic void beProduted() {System.out.println("房产生产");}@Overridepublic void beSelled() {System.out.println("房产销售");}
}
/*** 母公司就是抽象化角色(Abstraction)*/
public abstract class MotherCompany {private Product product;public MotherCompany(Product product) {this.product = product;}public void mange(){this.product.beProduted();this.product.beSelled();}
}
/*** 煤炭公司,实现化角色(RefinedAbstraction)*/
public class CoalCompany extends MotherCompany{public CoalCompany(Product product) {super(product);}@Overridepublic void mange() {super.mange();System.out.println("今年煤炭生意火爆");}
}
/*** 房产公司,实现化角色(RefinedAbstraction)*/
public class HouseCompany extends MotherCompany{public HouseCompany(Product product) {super(product);}@Overridepublic void mange() {super.mange();System.out.println("今年房地产生意不好");}
}
public class Test {public static void main(String[] args) {Product product=new Coal();MotherCompany motherCompany=new CoalCompany(product);motherCompany.mange();System.out.println("----------------");product=new House();motherCompany=new HouseCompany(product);motherCompany.mange();}
}

如果小王家又新增投资旅游产业,开了一家景点经营公司,怎么办呢?新增一个旅游公司的类、门票类,就可以了,原来的业务不用改,完全符合开闭原则

/*** 门票*/
public class Ticket extends Product {@Overridepublic void beProduted() {System.out.println("印刷门票");}@Overridepublic void beSelled() {System.out.println("卖门票");}
}
/*** 旅游公司*/
public class TourismCompany extends MotherCompany{public TourismCompany(Product product) {super(product);}@Overridepublic void mange() {super.mange();System.out.println("旅游人数爆火");}
}
public class Test {public static void main(String[] args) {Product  product=new Ticket();MotherCompany motherCompany=new TourismCompany(product);motherCompany.mange();}
}

桥梁模式的适用场景

桥梁模式的应用场景包括:

  1. 当你想要解耦抽象和具体类时,例如在软件系统中,抽象和具体的功能经常需要变化,而通过使用桥梁模式,你可以将它们解耦,使得你可以在不改变其他部分的情况下更改它们。
  2. 当你需要实现可扩展的软件系统时,桥梁模式可以帮助你实现更灵活的架构,因为你可以在不影响其他部分的情况下添加新的具体实现。
  3. 当你需要隐藏实现的细节时,桥梁模式可以帮助你隐藏实现的细节,只暴露公共接口,这样客户端只需要和抽象类打交道,不需要关心具体的实现细节。

总结

优点

创建灵活且易于扩展的软件产品、简化客户端代码、易于维护和修改等。

缺点

如增加系统的复杂性和理解难度、需要正确地识别出系统中两个独立变化的维度、需要对系统进行递归处理等。

总的来说,桥梁模式是一种结构型设计模式,它通过将抽象和具体解耦,使得它们可以独立地变化,从而提高了系统的灵活性和可扩展性,但同时也需要仔细考虑和设计才能正确应用。

 

相关文章:

设计模式之桥梁模式

什么是桥梁模式 桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变…...

“从部署到优化,打造高效会议管理系统“

目录 引言一、部署单机项目 - 会议OA1.1 硬件和软件环境准备1.2 检查项目1.3 系统部署1.后端部署 二、部署前后端分离项目 - SPA项目后端部署2.前端部署 总结 引言 在现代化办公环境中,会议是组织沟通、决策和合作的重要方式之一。为了提高会议的效率和质量&#x…...

Facebook广告效果数据获取

一、背景 公司每年在Facebook和Google上投放了大量的广告,我总不能让老板登录Facebook广告投放平台上去看广告效果,其实老板只关注每天花了多少钱引来了多少客户,每个客户平均花费多少钱,其它的他才不关心,有Facebook…...

nlp之文本转向量

文章目录 代码代码解读 代码 from tensorflow.keras.preprocessing.text import Tokenizer # 标记器(每一个词,以我们的数值做映射,)words [LaoWang has a Wechat account., He is not a nice person., Be careful.] # 把这句话中每一个单词&#xf…...

【luckfox】添加压力传感器hx711

文章目录 前言一、参考资料二、电路图三、驱动四、makefile——添加驱动五、dts——使能gpio5.1 参考5.2 改动1—— hx117节点5.3 改动2——引脚节点5.4 已经被定义的引脚5.5 gpio源码 六、改动总结——使能hx711七、验证驱动添加八、编写测试文件8.1 测试代码8.2 配置编译环境…...

C++11的lambda表达式

lambda来源于函数式编程的概念。C11这次终于把lambda加进来了。 lambda表达式有如下优点: 1、声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护…...

矩阵特征值与特征向量的理解

各位朋友大家好,我是小C哈哈哈,很高兴认识大家,在这里,我会将一些枯燥难懂的数学和算法知识以图片或动画的形式通俗易懂的展现给大家,希望大家喜欢。 线性代数中的矩阵特征值与特征向量这两个基本概念总是让很多人摸不…...

云原生安全:如何保护云上应用不受攻击

文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码: 2. 数据加密示例代…...

如何在用pip配置文件设置HTTP爬虫IP

首先,定义问题:在 Pip 中设置HTTP爬虫IP服务器,以便在网络上进行访问和下载。 亲身经验:我曾经遇到过类似问题,通过设置HTTP爬虫IP服务器成功解决了网络访问问题。 数据和引证:根据 pip 官方文档&#xff…...

2023MathorCup高校数模挑战赛B题完整解题代码教程

赛道 B: 电商零售商家需求预测及库存优化问题 问题背景: 电商平台存在着上千个商家,他们会将商品货物放在电商配套的仓库, 电商平台会对这些货物进行统一管理。通过科学的管理手段和智能决策, 大数据智能驱动的供应链…...

《动手学深度学习 Pytorch版》 10.7 Transformer

自注意力同时具有并行计算和最短的最大路径长度这两个优势。Transformer 模型完全基于注意力机制,没有任何卷积层或循环神经网络层。尽管 Transformer 最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语…...

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…...

MySQL篇---第四篇

系列文章目录 文章目录 系列文章目录一、并发事务带来哪些问题?二、事务隔离级别有哪些?MySQL的默认隔离级别是?三、大表如何优化?一、并发事务带来哪些问题? 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对 同一数据进行操作…...

em/px/rem/vh/vw单位的区别

一、绝对长度单位 1.px 表示像素,显示器上每个像素点大小都是相同的 二、相对长度单位 2.em 相对于当前对象内文本的字体尺寸,如未设置对行内文本字体的尺寸,则相对于浏览器的默认字体(1em16px) em值不是固定的&…...

【C++】多态 ③ ( “ 多态 “ 实现需要满足的三个条件 | “ 多态 “ 的应用场景 | “ 多态 “ 的思想 | “ 多态 “ 代码示例 )

文章目录 一、" 多态 " 实现条件1、" 多态 " 实现需要满足的三个条件2、" 多态 " 的应用场景3、" 多态 " 的思想 二、" 多态 " 代码示例 一、" 多态 " 实现条件 1、" 多态 " 实现需要满足的三个条件 &q…...

创建一个Keil项目

1、创建项目 2、选择存放的文件夹,还有设置项目名 3、选择型号(因为没有STC,用下面这个替代,功能差不多) 4、选择不用启动文件 5、就会得到下面这个,可以在Source Group 1下面编写代码了 6、右键source Group 1,添加c语…...

Xray的简单使用

xray 简介 xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均…...

Linux Ubunto Nginx安装

一 安装前 环境准备 gcc $ sudo apt-get install gcc zlib $ sudo apt-get install zlib1g-dev pcre $ sudo apt-get install libpcre3 libpcre3-dev openssl $ sudo apt-get install openssl libssl-dev‘ ubuntu 安装 libssl-dev失败的解决方案 1.安装aptitude sudo apt-g…...

深度学习中的epoch, batch 和 iteration

名词定义epoch使用训练集的全部数据进行一次完整的训练,称为“一代训练”batch使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这样的一部分样本称为:“一批数据”iteration使用一个batch的数据对模型进行一次参数更新的过…...

unity开发安卓视频文件适配手机和平板

using UnityEngine; using UnityEngine.UI;public class VideoResize : MonoBehaviour {private RawImage rawImage;private VideoPlayer videoPlayer;private void Start(){rawImage GetComponent<RawImage();videoPlayer GetComponent<VideoPlayer>();// 播放视频…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...