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

目录

          • 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);
    }
  
    @Override
    public 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.示例截图
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)

文章目录 将C#对象转换为json字符串Newtonsoft模块的安装用Newtonsoft将对象转换为json字符串 将json字符串转换为C#对象 将C#对象转换为json字符串 本介绍将基于C#中的第三方库Newtonsoft进行,因此将分为Newtonsoft模块的安装和使用两部分。该模块的优势在于只需要…

PCB笔记(二十六):PCB检查

前言 首先检查元器件是否100% 放置 文章目录 1、打开DRC2、database check3、检查DRC4、检查多余的线5、其他需要注意的点a.检查差分线、等长线是否已调好b.注意检查晶振、电感等元件上/下方是否其他线经过(一般不允许线经过)c.打开place_bo…

node安装以及node的包管理工具

node安装以及node的包管理工具 node安装nvm管理工具 node安装 1、下载node链接: 点击这里 2、选择需要下载的版本以及对应的系统版本 nvm管理工具 1、下载nvm链接: 点击这里 2、双击运行.exe文件 全部默认安装即可 3、nvm常用命令 nvm list avaliable 显示所有可以下载的n…

umi项目配置之项目构建时配置umirc.ts

对于 umi 中能使用的自定义配置,你可以使用项目根目录的 .umirc.ts 文件或者 config/config.ts,值得注意的是这两个文件功能一致,仅仅是存在目录不同,2 选 1 ,.umirc.ts 文件优先级较高 umi 的配置文件是一个正常的 n…

ACM实训冲刺第七天

【碎碎念】今天开始做第2套的习题 Anton and Danik 问题 安东喜欢下棋,他的朋友丹尼克也喜欢下棋。 一旦他们连续玩了n局。每场比赛都知道谁是赢家——安东还是丹尼尔。没有一场比赛以平局结束。 现在安东想知道,谁赢了更多的比赛,他还是丹…

【数据可视化01】matplotlib实例介绍4之六边形分箱图

目录 一、引言二、实例介绍 一、引言 hexbin是一个二维直方图,其中箱子是六边形,颜色表示每个箱子内的数据点数。 二、实例介绍 import matplotlib.pyplot as plt import numpy as np# Fixing random state for reproducibility np.random.seed(19680…

jmeter中java请求,解决不支持协议和元件,实现自定义元件

目录 java请求 作用场景 JavaTest类源码分析 编写java请求样例 新建java工程,导入jmeter主要依赖。 编写java请求类,继承AbstractJavaSamplerClient, 导入工程为jar包,放置jmeter安装目录下lib/ext目录 重启jmeter,添加ja…

Notepad8.1.9汉化中文版

下载地址:Notepad8.1.9.zip 一款优秀免费的源代码编辑器,支持语法高亮的开源纯文本编辑器,并且可以替代系统自带的记事本的功能。

线程纵横:C++并发编程的深度解析与实践

hello !大家好呀! 欢迎大家来到我的Linux高性能服务器编程系列之《线程纵横:C并发编程的深度解析与实践》,在这篇文章中,你将会学习到C新特性,并发编程,以及其如何带来的高性能的魅力&#xff0…

【经验总结】超算互联网服务器 transformers 加载本地模型

1. 背景 使用 超算互联网 的云服务,不能连接外网,只能把模型下载到本地,再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…

HTML特殊字符

特殊字符 有特殊含义的字符成为字符实体 对于有特殊含义的字符,需要通过转移字符来表示 <span> <br><a href"http://www.atguigu.com">我 爱 前端</a> <br>&amp;amp; 效果

HTML常用标签-布局相关标签

布局标签 div标签 俗称"块",主要用于划分页面结构,做页面布局 自己独占一行的元素&#xff0c;设置宽高生效 span标签 俗称"层",主要用于划分元素范围,配合CSS做页面元素样式的修饰 不会自己独占一行的元素&#xff0c;设置宽高不生效 代码 <div style&…

两小时看完花书(深度学习入门篇)

1.深度学习花书前言 机器学习早期的时候十分依赖于已有的知识库和人为的逻辑规则&#xff0c;需要人们花大量的时间去制定合理的逻辑判定&#xff0c;可以说是有多少人工&#xff0c;就有多少智能。后来逐渐发展出一些简单的机器学习方法例如logistic regression、naive bayes等…

【多模态】30、Monkey | 支持大尺寸图像输入的多任务多模态大模型

文章目录 一、背景二、方法2.1 Enhancing Input Resolution2.2 Multi-level Description Generation2.3 Multi-task Training 三、效果3.1 Image Caption3.2 General VQA3.3 Scene Text-centric VQA3.4 Document-oriented VQA3.5 消融实验3.6 可视化 论文&#xff1a;Monkey : …

maven找不到依赖,in offline mode

问题描述&#xff1a; [ERROR] Plugin org.jetbrains.kotlin:kotlin-maven-plugin:1.2.71 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.jetbrains.kotlin:kotlin-maven-plugin:jar:1.2.71: Cannot access aliyunmaven (ht…

硅胶可以镭射吗?

在科技发展的今天&#xff0c;我们经常会遇到各种各样的材料&#xff0c;其中就有一种叫做硅胶的材料。那么&#xff0c;硅胶可以镭射吗&#xff1f;答案是肯定的&#xff0c;硅胶不仅可以镭射&#xff0c;而且在某些应用中&#xff0c;它的镭射特性还非常突出。 首先&#xff…

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维&#xff0c;提高工作效率。 2、我用代码批判思维&#xff0c;逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员&#xff0c;是哪些重要的专业习惯&#xff0c;让我如此优秀&#xff1f; 2、可以免费获取到的IT资源 1、《软件工程&a…

【35分钟掌握金融风控策略26】定价策略

目录 定价策略 定价策略的开发、部署、监控和调优 定价策略开发 定价策略部署 定价策略监控 定价策略调优 定价策略 定价是对授信审批通过的客户给予合适利率的过程。如何定价、定价多少是由定价策略来决定的。定价策略的制订要遵循“收益覆盖风险”原则&#xff0c;对于…

暗黑4可以搬砖吗?暗黑4怎么搬砖 搬砖攻略

暗黑4可以搬砖吗&#xff1f;暗黑4怎么搬砖 搬砖攻略 暗黑破坏神4属于是暴雪旗下一款经典游戏IP&#xff0c;在全世界有着广泛的玩家群体&#xff0c;更是在今年暴雪国服宣布回归之后&#xff0c;吸引了一大批新玩家加入。今天小编就为大家带来暗黑4的详细搬砖教程。 现在我们…

【工作篇】软件工程师的知识基础(持续更新)

目录 1. linux 知识篇 1. linux 知识篇 1. Linux API 是什么 Linux API 是指 Linux 操作系统 提供的应用程序接口&#xff0c;用于与操作系统进行交互。它包含了一系列的函数、系统调用、库函数和数据结构&#xff0c;用于实现各种系统级的操作&#xff0c;如文件操作、进程…