【软考】设计模式之桥接模式

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 适用性
          • 6. 优点
          • 7. 缺点
          • 8. java示例

1. 说明
  • 1.将抽象部分与其实现部分分离,使它们都可以独立地变化。
  • 2.桥接模式(Bridge Pattern)属于对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
2. 应用场景
  • 1.图形界面库:图形界面库提供了一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供了多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。通过使用桥接模式,可以将界面元素和绘制方式解耦,使得它们可以独立地变化。
  • 2.电子商务平台:在电子商务平台中,商品和展示方式可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得商品和展示方式可以独立变化。
  • 3.操作系统的文件系统:文件系统可以支持多种存储介质(如磁盘、光盘、网络存储等),同时也可以支持多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型进行解耦,使得它们可以独立变化。
  • 4.游戏开发中的人物角色:在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等)。这些属性和技能可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得人物角色的属性和技能可以独立变化。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.Abstraction(抽象化角色):定义抽象类的接口,并包含一个对实现化对象的引用。
  • 2.RefinedAbstraction(扩展抽象化角色):扩充由Abstraction定义的接口。是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 3.Implementor(实现化角色):定义实现类接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
  • 4.ConcreteImplementor实现Implementor接口并定义它的具体实现。
5. 适用性
  • 1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  • 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
  • 3.对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
  • 4.(C++)想对客户完全隐藏抽象的实现部分
  • 5.有许多类要生成的类层次结构。
  • 6.想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
6. 优点
  • 1.分离抽象接口及其实现部分:桥接模式允许将抽象与实现解耦,使得抽象和实现可以独立地变化。这有助于降低系统的耦合性,提高系统的灵活性和可扩展性。

  • 2.提高可重用性:由于抽象和实现之间的分离,桥接模式可以提高代码的可重用性。例如,当需要实现不同的具体实现时,只需要更改实现部分,而无需修改抽象部分。

  • 3.支持动态组合:桥接模式使用对象间的组合关系替代了继承关系,使得系统可以更加灵活地进行动态组合。这有助于降低系统的复杂性,提高系统的可维护性。

7. 缺点
  • 1.增加系统的理解与设计难度:由于桥接模式需要在抽象层进行设计和编程,这可能会增加系统的理解与设计难度。开发者需要一开始就针对抽象层进行设计与编程,这需要一定的技术水平和经验。
  • 2.识别独立变化的维度:在系统中正确识别出两个独立变化的维度并不是一件容易的事情。这需要对系统有深入的理解和分析,才能准确地找到这两个维度。
  • 3.可能导致类的数量增加:桥接模式将抽象部分与实现部分分离,这可能会导致系统中类的数量增加。这可能会增加系统的复杂性,需要更加仔细地设计和管理代码。
8. java示例
  • 1.衣服抽象类Abstraction
package com.learning.bridge;/*** 衣服抽象类*/
public abstract class Clothing {// 桥接的部分,通过Color接口与实现部分连接protected Color color;public Clothing(Color color) {this.color = color;}public abstract void showColor();
} 
  • 2.衬衫类RefinedAbstraction
package com.learning.bridge;/*** 衬衫*/
public class Shirt extends Clothing {// 桥接的部分,通过Color接口与实现部分连接public Shirt(Color color) {super(color);}@Overridepublic void showColor() {  System.out.println("The shirt is " + color.getColorName() + ".");}  
}
  • 3.颜色类Implementor
package com.learning.bridge;/*** 颜色接口*/
public interface Color {// 获取颜色String getColorName();  
}  
  • 4.红色类ConcreteImplementor
package com.learning.bridge;/*** 红色*/
public class RedColor implements Color {  @Override  public String getColorName() {  return "red";  }  
}  
  • 5.蓝色类ConcreteImplementor
package com.learning.bridge;/*** 蓝色*/
public class BlueColor implements Color {  @Override  public String getColorName() {  return "blue";  }  
}
  • 8.客户端
package com.learning.bridge;/*** 客户端*/
public class Client {public static void main(String[] args) {  // 创建一个红色的衬衫  Clothing redShirt = new Shirt(new RedColor());  redShirt.showColor();// 创建一个蓝色的衬衫(不需要修改Shirt类的代码)  Clothing blueShirt = new Shirt(new BlueColor());  blueShirt.showColor();}  
}
  • 7.示例截图
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot实现 QQ邮箱验证码

SpringBoot实现 QQ邮箱验证码 文章目录 SpringBoot实现 QQ邮箱验证码一、开通SMTP校验码1.登录qq邮箱2.开启SMTP服务3.发送手机短信4.得到授权码 二、回到spring项目中1.导入所需依赖2.验证码工具类3.具体实现逻辑(serviceimpl) 三、测试qq邮箱验证码 一、开通SMTP校验码 1.登…

zookeeper集群部署以及zookeeper原理

文章目录 简介工作原理特性官网地址准备节点准备环境准备JAVA主机映射 部署 简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服…

Codeforces Round 944 (Div. 4)(A,B,C,D,E,F,G,H)

比赛链接 这场不难, G G G 和 H H H 比较有意思。 G G G 题需要一定的二进制和数据结构的知识, H H H 题是个 2 − s a t 2-sat 2−sat 的题,算法名字吓人但是其实很简单,题目本身也很板,建议趁机学习一波。 A. My …

棒材直线度测量仪 专为圆形产品研发设计 在线无损检测

棒材直线度测量仪采用了先进的技术,能够实现在线无损检测,为生产过程提供了极大的便利。专为圆形产品设计,它能够精确测量棒材的米直线度及外径、椭圆度尺寸,为质量控制提供可靠的数据支持。 在线直线度测量仪不仅具有出色的性能…

Stm32串口搭配DMA实现自定义printf、scanf

前言:本文仅供学习参考使用,主要目的是让大家快速使用串口调试,文章所提及的GCC适用于Clion,Vscode等第三方编辑器的用户。作者有时间会继续更新^_^ 一、GCC环境 1、标准库 (1)、使用方法 在主函数while(1)初始化中,添加Seria…

嵌入式学习-M4的基本定时器

基本介绍 框图分析 时钟选择 计数器结构 开启重装载值寄存器的影子寄存器的工作时序图 未开启重装载值寄存器的影子寄存器的工作时序图 更新事件以及中断 相关寄存器 相关库函数

全球排名第一的质量管理(QMS)系统介绍,100%免费开源

什么是Odoo全程质量管理? 开源智造Odoo免费开源质量管理系统将政策、标准和实践规范化并自动化,以最小的开销提供最高质量的产品。快速轻松地选择要执行的测试,设置参数以评估结果,并定义接收时和生产过程中的测试策略。Odoo会自动…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么?二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展,同时也迎来了互联网发展的高峰,OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…

网络安全等级保护测评指标解读(2.0)

网络安全等级保护2.0测评指标解读: 1、物理和环境安全 2、网络和通信安全 3、设备和计算安全 4、应用和数据安全 5、安全策略和管理制度 6、安全管理机构和人员 7、安全建设管理 8、安全运维管理 软件资料清单列表部分文档: 工作安排任务书,…

HCIA和HCIP区别大吗?小白请看这

华为认证以其专业性和实用性受到了业界的广泛认可。 HCIA、HCIP、HCIP这三个级别,你会选哪个?IE含金量不用多说,IA还是IP,你会纠结吗。 但面对这两个级别的认证,初学者或者“小白”们可能会感到困惑:两者…

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间: 全局名称空间:每个程序的主要部分定义了全局的变量名和变量值的对应关系,这样就叫做全局名称空间 局部名称…

Ajax额

原生Ajax xml 已被json取代 http 请求方法urlhttp版本号 network 谷歌浏览器查看请求报文和响应报文 F12 network header里面有 请求头 响应头 点击view source 可以查看请求响应行 请求体在请求行头下面 get请求有url参数,请求体变为query String…