简谈设计模式之桥接模式

devtools/2024/9/20 1:21:45/ 标签: 设计模式, 桥接模式, java, 开发语言

桥接模式是一种结构型设计模式, 它将抽象部分和它的实现部分分离, 使它们可以独立变化. 这意味着可以改变它的抽象和它的实现, 而不会相互影响

桥接模式结构
  • 抽象 (Abstraction): 定义抽象类, 并包含一个对实现类对象的引用
  • 拓展抽象 (Refined Abstraction): 拓展抽象类, 通过组合的方式调用实现类的方法
  • 实现 (Implementor): 定义实现类的接口, 但不具体实现, 它仅提供一个接口, 供具体实现类进行实现
  • 具体实现 (ConcreteImplementor): 具体实现Implementor接口
桥接模式实现

假设有一个画图程序, 需要渲染不同图形, 同时还需要在不同操作系统上渲染, 可以使用桥接模式来实现这个程序

java">// Implementor
interface DrawingAPI {void drawCircle(double x, double y, double radius);
}// ConcreteImplementorA
class DrawingAPI1 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.println("API1.circle at " + x + ":" + y + " radius " + radius);}
}// ConcreteImplementorB
class DrawingAPI2 implements DrawingAPI {@Overridepublic void drawCircle(double x, double y, double radius) {System.out.println("API2.circle at " + x + ":" + y + " radius " + radius);}
}// Abstraction
abstract class Shape {protected DrawingAPI drawingAPI;protected Shape(DrawingAPI drawingAPI) {this.drawingAPI = drawingAPI;}public abstract void draw();                               // low-levelpublic abstract void resizeByPercentage(double pct);       // high-level
}// RefinedAbstraction
class CircleShape extends Shape {private double x, y, radius;public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {super(drawingAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawingAPI.drawCircle(x, y, radius);}@Overridepublic void resizeByPercentage(double pct) {radius *= (1.0 + pct / 100.0);}
}// Client
public class BridgePatternDemo {public static void main(String[] args) {Shape[] shapes = new Shape[] {new CircleShape(1, 2, 3, new DrawingAPI1()),new CircleShape(5, 7, 11, new DrawingAPI2()),};for (Shape shape : shapes) {shape.resizeByPercentage(2.5);shape.draw();}}
}

DrawingAPI 是实现接口,定义了具体的绘制操作。

DrawingAPI1DrawingAPI2 是具体实现类,分别实现了具体的绘制操作。

Shape 是抽象类,包含一个 DrawingAPI 的引用。

CircleShape 是具体的图形类,实现了具体的绘制操作,并委托给 DrawingAPI。

BridgePatternDemo 是客户端代码,展示了如何使用桥接模式来绘制不同的图形。

优点:

  • 分离抽象接口与实现
  • 遵循了开闭原则
  • 提高系统拓展性
  • 实现细节对客户是透明的

缺点:

  • 增加了系统设计难度
  • 增加了代码的难度

http://www.ppmy.cn/devtools/59445.html

相关文章

堆、栈和队列(数据结构)

堆、栈和队列(数据结构) 这里写目录标题 堆、栈和队列(数据结构)**栈****队列**堆(Heap)()队列(Queue)(FIFO)栈(Stack&…

搜维尔科技:通过 Xsens MVN Link 套装测试动作捕捉动画,由虚幻引擎5渲染

通过Xsens MVN Link套装测试动作捕捉动画,由虚幻引擎5渲染 搜维尔科技:通过 Xsens MVN Link 套装测试动作捕捉动画,由虚幻引擎5渲染

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期:2024 年 7 月 10 日 星期三 姓名:XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位,参加部门早会,了解了今天的实习任务和目标,即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

Flask 静态文件处理

1. 静态文件目录 Flask 默认会在应用的根目录下寻找一个名为 static 的文件夹,并将其作为静态文件的存储目录。你可以通过 static_folder 参数来指定不同的静态文件目录路径。 from flask import Flask app Flask(__name__, static_foldermy_static) 2. 静态文件 …

图扑低代码数字孪生 Web SCADA 智慧钢厂

2024 年 4 月,中国钢铁工业协会发布了《钢铁行业数字化转型评估报告(2023年)》(以下简称《报告》)。《报告》指出,绝大部分钢铁企业建立了数字化转型相关管理组织和团队,并加强其规划落实&#…

LDAPWordlistHarvester:基于LDAP数据的字典生成工具

关于LDAPWordlistHarvester LDAPWordlistHarvester是一款功能强大的字典列表生成工具,该工具可以根据LDAP中的详细信息生成字典列表文件,广大研究人员随后可以利用生成的字典文件测试目标域账号的非随机密码安全性。 工具特征 1、支持根据LDAP中的详细信…

CentOS 7 网络配置

如想了解请查看 虚拟机安装CentOS7 第一步:查看虚拟机网络编辑器、查看NAT设置 (子网ID,网关IP) 第二步:配置VMnet8 IP与DNS 注意事项:子网掩码与默认网关与 第一步 保持一致 第三步:网络配置…

初学者指南:如何搭建和配置 Nginx 服务器

初学者指南:如何搭建和配置 Nginx 服务器 Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。本文将详细介绍如何在 Linux 上安装、配置和管理 Nginx 服务器。 一、安装 Nginx Nginx 可以安装在多种操作系统上&#x…

Window -- redis 服务注册、Mysql 服务注册

Windows 服务注册 cd 进入 Redis 主目录 cd /d F:\Redis-x64-5.0.14.1注册 Redis 为系统服务,并指定配置文件 redis-server --service-install redis.windows.conf --loglevel verbose开启服务 redis-server --service-start停止服务 redis-server --service-s…

关于HDFS 和HBase

Apache HBase 被设计为在 Hadoop 分布式文件系统 (HDFS) 上运行的一个特殊类型的数据库。大白话: 想象一下,你有一个巨大的图书馆,这个图书馆就像 HDFS,它的架子上堆满了各种各样的书籍,每本书都非常厚,而…

安防监控视频平台LntonCVS视频融合共享平台智慧消防实现远程集中视频监控方案

近年来,电力系统内变电站着火事件频发,这对消防安全管理提出了严峻挑战。我国消防安全基础设施不完善、管理机制不健全、应急处置能力不足及公众消防安全意识淡薄等问题,严重制约了消防安全的提升。因此,加强变电站的消防安全管理…

HashMap源码解析

目录 一:put方法流程 二:get方法 三:扩容机制 一:put方法流程 public V put(K key, V value) {return putVal(hash(key), key, value, false, true); }final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {No…

Qcom平台通过Hexagon IDE 测试程序性能指导

Qcom平台通过Hexagon IDE 测试程序性能指导 1 安装Hexagon IDE工具2 测试工程2.1 打开Hexagon IDE2.2 新建工程2.3 添加测试案例2.3.1 方法一:新建2.3.2 方法二:拷贝 2.4 配置测试环境2.4.1 包含头文件2.4.2 添加程序优化功能(需先bulid一下)2.4.3 添加g…

79. UE5 RPG 创建技能冷却和消耗

在这一篇里面,我们接着优化技能,现在角色添加的主动技能能够同步到ui上面。我们在这一篇文章里面,完善技能的消耗(释放技能减少蓝量)和冷却机制。 我们可以看到,在技能类默认值这里,可以设置它的…

分类题解清单

目录 简介MySQL题一、聚合函数二、排序和分组三、高级查询和连接四、子查询五、高级字符串函数 / 正则表达式 / 子句 算法题一、双指针二、滑动窗口三、模拟四、贪心五、矩阵六、排序七、链表八、设计九、前缀和十、哈希表十一、字符串十二、二叉树十三、二分查找十四、回溯十五…

LabVIEW红外热波图像缺陷检

开发使用LabVIEW开发的红外热波图像缺陷检测系统。该系统结合红外热像仪、工业相机和高效的数据采集硬件,实现对工件表面缺陷的自动检测和分析。通过LabVIEW的强大功能,系统能够实时采集、处理和显示红外热波图像,有效提高了检测的精度和效率…

Windows 11预览补丁KB5040527影响火绒驱动加载的解决办法

7 月 11 日,微软更新Windows 11 预览版本补丁 KB5040527,补丁安装后会影响火绒驱动加载导致火绒安全软件服务异常,补丁相关信息如下: https://blogs.windows.com/windows-insider/2024/07/11/releasing-windows-11-builds-22621-…

如何在Java中处理空集合和空指针

文章目录 概要示例代码详细解释如下正确处理集合的技巧总结 概要 在Java开发中,我们经常需要处理集合(如ArrayList)的情况。为了确保程序的稳定性和正确性,我们必须妥善处理空集合和空指针。 示例代码 public class Main {publ…

大语言模型(Large Language Model, LLM)——初步详细了解!!!

LLM 1.1 **基本概念**1.2. **主要特点**1.3. **主要应用**1.4. **著名大语言模型**1.5. **挑战和局限**1.6. **未来发展**2.1. 文献综述与资料收集2.2. 数据分析与预处理2.3. 实验设计与优化2.4. 结果分析与解释2.5. 科研写作与报告6. 知识扩展与创新2.7. 具体工具与平台2.8 示…

装修设计行业全屋定制类小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 装修设计行业全屋定制类小程序源码系统是基于现代技术栈开发的,专为装修设计行业量身定制。该系统采用了模块化架构设计,使得开发者能够根据需要灵活选择和组合功能模块,从而快速构建出符合自己业务需求的小程序。 该系统主要面向…