【设计模式】结构型模式(三):桥接模式、外观模式

结构型模式(三):桥接模式

  • 4.桥接模式(Bridge)
    • 4.1 结构
    • 4.2 示例
      • 4.2.1 抽象类
      • 4.2.2 细化抽象类
      • 4.2.3 实现类接口
      • 4.2.4 具体实现类
      • 4.2.5 客户端
  • 5.外观模式(Facade)

在这里插入图片描述

4.桥接模式(Bridge)

桥接模式Bridge Pattern)是设计模式中的一种结构型模式,主要用于 将抽象部分与实现部分分离,使它们可以独立变化。这种模式在多种场景下非常有用,尤其是在需要将抽象和实现解耦的情况下。以下是桥接模式的主要特点和应用场景:

  • 分离抽象和实现:将抽象部分和实现部分分离,使它们可以独立变化。
  • 减少类的爆炸性增长:通过将抽象和实现解耦,可以减少类的数量,提高系统的可维护性。
  • 动态切换实现:可以在运行时动态切换实现部分,而不需要修改客户端代码。

4.1 结构

  • Abstraction抽象类):定义抽象类的接口,包含一个对实现部分的引用
  • RefinedAbstraction细化抽象类):扩展抽象类,提供更具体的实现。
  • Implementor实现类接口):定义实现类的接口,具体实现类需要实现这个接口。
  • ConcreteImplementor具体实现类):实现实现类接口,提供具体的实现。

4.2 示例

假设我们有一个图形绘制系统,需要支持不同的图形(圆形、方形等)和不同的绘制方式(如使用不同的颜色或填充方式)。我们可以使用桥接模式来实现这个系统。

4.2.1 抽象类

// 抽象类
public abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}public abstract void draw();
}

4.2.2 细化抽象类

// 细化抽象类
public class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}@Overridepublic void draw() {drawAPI.drawCircle(x, y, radius);}
}public class Rectangle extends Shape {private int x, y, width, height;public Rectangle(int x, int y, int width, int height, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.width = width;this.height = height;}@Overridepublic void draw() {drawAPI.drawRectangle(x, y, width, height);}
}

4.2.3 实现类接口

// 实现类接口
public interface DrawAPI {void drawCircle(int x, int y, int radius);void drawRectangle(int x, int y, int width, int height);
}

4.2.4 具体实现类

// 具体实现类
public class RedDrawAPI implements DrawAPI {@Overridepublic void drawCircle(int x, int y, int radius) {System.out.println("Drawing Circle [Color: Red, x: " + x + ", y: " + y + ", radius: " + radius);}@Overridepublic void drawRectangle(int x, int y, int width, int height) {System.out.println("Drawing Rectangle [Color: Red, x: " + x + ", y: " + y + ", width: " + width + ", height: " + height);}
}public class BlueDrawAPI implements DrawAPI {@Overridepublic void drawCircle(int x, int y, int radius) {System.out.println("Drawing Circle [Color: Blue, x: " + x + ", y: " + y + ", radius: " + radius);}@Overridepublic void drawRectangle(int x, int y, int width, int height) {System.out.println("Drawing Rectangle [Color: Blue, x: " + x + ", y: " + y + ", width: " + width + ", height: " + height);}
}

4.2.5 客户端

public class BridgePatternDemo {public static void main(String[] args) {Shape redCircle = new Circle(100, 100, 50, new RedDrawAPI());Shape blueRectangle = new Rectangle(10, 10, 100, 100, new BlueDrawAPI());redCircle.draw();blueRectangle.draw();}
}

输出结果:

Drawing BridgePatternDemo.Circle [Color: Red, x: 100, y: 100, radius: 50
Drawing BridgePatternDemo.Rectangle [Color: Blue, x: 10, y: 10, width: 100, height: 100

5.外观模式(Facade)

外观模式Facade Pattern)是一种设计模式,用于 为复杂的子系统提供一个简化的接口。它的主要目的是减少客户端与子系统之间的依赖关系,使客户端代码更容易理解和使用。以下是外观模式的几个关键点:

  • 简化接口:外观模式通过提供一个统一的高层接口,使客户端代码可以更简单地访问子系统的功能,而不需要了解子系统的内部复杂性。
  • 降低耦合度:客户端代码只需与外观类交互,而不必与子系统的多个类直接交互,从而降低了系统的耦合度。
  • 提高灵活性:外观类可以灵活地控制对子系统的访问,可以在不改变客户端代码的情况下,修改子系统的实现。

假设你有一个 家庭影院系统,包括 DVD 播放器、投影仪、屏幕、音响等设备。每个设备都有自己的控制接口,如果直接操作这些设备,客户端代码会非常复杂。通过外观模式,可以创建一个家庭影院外观类,提供一个简单的接口来控制整个系统。

public class HomeTheaterFacade {private DvdPlayer dvdPlayer;private Projector projector;private Screen screen;private Amplifier amplifier;public HomeTheaterFacade(DvdPlayer dvdPlayer, Projector projector, Screen screen, Amplifier amplifier) {this.dvdPlayer = dvdPlayer;this.projector = projector;this.screen = screen;this.amplifier = amplifier;}public void watchMovie(String movie) {System.out.println("Get ready to watch a movie...");screen.down();projector.on();dvdPlayer.play(movie);amplifier.on();}public void endMovie() {System.out.println("Shutting movie theater down...");screen.up();projector.off();dvdPlayer.stop();amplifier.off();}
}

通过这个外观类,客户端代码可以非常简单地控制整个家庭影院系统:

public class Client {public static void main(String[] args) {DvdPlayer dvdPlayer = new DvdPlayer();Projector projector = new Projector();Screen screen = new Screen();Amplifier amplifier = new Amplifier();HomeTheaterFacade facade = new HomeTheaterFacade(dvdPlayer, projector, screen, amplifier);facade.watchMovie("The Matrix");facade.endMovie();}
}

这样,客户端代码只需要调用外观类的 watchMovieendMovie 方法,而不需要关心每个设备的具体操作。

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

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

相关文章

初识Linux

Linux指令 输入指令,实际上是在Linux环境下,做Windows的操作。 ls指令 语法: ls [选项][目录或文件] 功能: 对于目录,该命令列出该目录下的所有子目录与文件。 对于文件,将列出文件名以及其他信息。 常…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,或者是第三方公司提供的是Android的库,这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种,Module模…

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求,即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

Redis ——发布订阅

问题引入: 服务器A、B、C、D,客户端:C1,C2,C3,C4; 客户端基于集群聊天服务器的负载均衡分配; C1 被分配到A,C2 被分配到B,C3 被分配到C,C4 被分…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

单链表专题

单链表 1. 链表的概念2. 链表的分类3. 实现无头单向非循环链表(单链表)3.1 单链表的声明3.2 单链表的打印3.3 尾插3.4 头插3.5 尾删3.6 头删3.7 查找3.8 在指定位置之前插入数据3.9 在指定位置之后插入数据3.10 删除指定节点3.11 销毁链表 4. 一些细节4.…

K8S篇(基本介绍)

目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

中国500米分辨率逐月平均EVI数据集(2000-2022)

EVI是在归一化植被指数(NDVI)的基础上进行改进的,通过卫星不同波段探测数据组合而成。EVI考虑了大气校正,包括大气分子、气溶胶、水汽和臭氧等因素,以解决NDVI容易饱和的问题。EVI的计算公式考虑了蓝光和红光波段&…

二级列表联动

介绍 本示例主要介绍了List组件实现二级联动(Cascading List)的场景。 该场景多用于商品种类的选择、照片不同类型选择等场景。 效果图 使用说明: 滑动二级列表侧控件(点击没用),一级列表随之滚动。&…

基于matlab的人民币面额识别

本文通过分析第五版人民币的特征,利用纸币中央数字的特征提取和识别的方法,通过matlab软件实现对第五版人民币的100元、50元和20元的识别。 Matlab函数介绍 Imread 函数imread用于读取图片文件中的数据。 调用格式: A imread(filename,…

Docker篇(实际应用)

目录 一、MySQL 部署 1. 拉取 MySQL 镜像 2. 查看镜像 3. 创建 MySQL 容器 4. 进入 MySQL 容器,登陆 MySQL 5. 远程登陆 MySQL 6. 查看容器 IP 地址 二、tomcat 部署 1. 拉取 tomcat 镜像 2. 创建 tomcat 容器 3. 搭建 Tomcat 服务并部署 web 应用 三、Nginx 部署 …

别名路径联想设置

如何使用/进行路径提示? 找到jsconfig.json文件,如何项目中没有的话,自行创建 {"compilerOptions": {"paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dis…

osi七层模型

文章目录 1、网络层1、数据链路层2、以太网和mac地址3、地址解析协议(arp)1、免费arp 4、物理层1、双绞线(网线) 5、总结 1、网络层 路由器就是网络层设备,因为是根据目标ip报文来实现转发的,三层的 1、数据链路层 作用 解决了,ip报文在链路…

spark (算子 ) groupBykey+Map 和 reduceBykey 的区别

1)面试题:groupByKeymap和reduceByKey都能实现分布式分组聚合,有什么区别? - groupByKey没有Map端聚合的操作,只做分组,必须等分区结束才能实现,最终map需要做整体聚合 - reduceByKey是有Map端聚…

mysql--多表查询

目录 一、联合查询 案例1,UNION 案例2,UNION ALL 二、表连接查询 (一)内连接 (二)外连接 1.左外连接 2.右外连接 3.全外连接 去重关键字 distinct 三、自连接 案例1: 案例2&…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作,这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞:必须保证…

打好“组合拳”,实现国有企业降本增效

打好“组合拳”,实现国有企业降本增效 在当前经济不确定性加剧、市场寒意明显的背景下,众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻,各行业普遍出现发展乏力的现象,促使企业开始重视“修炼内功”、“向内挖…

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了,金媒婚恋相亲系统已经更新至最新的10.4版本了!本人作为商业用户也已经更新至最新的旗舰版了,更新的内容是啥!这个官方都有列出,一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…

新能源行业必会基础知识-----电力现货市场理论篇-----电力现货市场组织-----配套措施

新能源行业必会基础知识-----电力现货市场理论篇-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/143364261 这本书是2023年出版的,是当下了解国内电力市场最好的途径了。还是推荐大家买来这本书进行阅读观看,最好作为随身携带…

【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)

博主说明:本文项目编号 T 061 ,文末自助获取源码 \color{red}{T061,文末自助获取源码} T061,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…