设计模式-桥接、职责链、中介

news2025/1/10 20:32:38

前言

本文为datawhale2022年12月组队学习《大话设计模式》task6打卡学习。
【教程地址】https://github.com/datawhalechina/sweetalk-design-pattern

一、桥接模式

1.1 基本定义

桥接模式(Bridge Pattern)又称为柄体(Handle and Body)模式接口(Interfce)模式,是将抽象部分与其实现部分分离,使它们都可以独立地变化。

1.2 问题引入

有不同品牌的手机,同时这些手机上还要安装不同的应用软件,考虑在需要不断增加软件的情况下,如果设计相应的抽象类。
需要注意对于不同品牌的手机,软件基本无法兼容。因此如果手机需要增加软件,就需要针对不同品牌的手机分别实现软件功能。

1.2.1 问题分析

实现该问题的程序通常会采用继承方式设计,那么父类和子类之间会具有非常紧密的依赖关系,父类中的任何变化都会影响子类,子类继承的实现如果无法解决新需求就必须重写或替换父类。如此设计会导致类爆炸问题,并且扩展不灵活。

1.2.2 问题解决

考虑到单独使用品牌或单独使用软件作为抽象类,都会在有新的需求来临后使得父类必须重写。因此需要使用合成/聚合原则代替类继承思想设计程序,是应该有个“手机品牌”抽象类和“手机软件”抽象类,让不同的品牌和功能都分别继承于它们,这样要增加新的品牌或新的功能都不用影响其他类了。结构图:
在这里插入图片描述
在工程中,包括以下四个角色:

  • Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个具有关联关系的Implementor 的对象。
  • RefinedAbstraction(扩充抽象类):继承并实现抽象类中的接口,并在其中调用Implementor 对象的相关业务方法。
  • Implementor(实现类):用于定义实现类的接口,提供基本的业务方法供抽象类调用,以完成复杂的操作。
  • ConcreteImplementor(具体实现类):继承并实现 Implementor 的接口,在不同的具体实现类中提供不同的操作方法,通过向上转型的方式完成方法的调用。

1.2.3 代码实现

官方源码链接:
桥接模式Java实现
桥接模式python实现

1.3 应用场景

客观来说这个刚接触确实很难直接应用,但是一旦理解透彻对于面向对象设计有非常大的帮助。有以下情况,可以尝试使用:

  • 1.“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
  • 2.一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
  • 3.对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

1.4.1 优点

  • 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法,它避免了继承导致的类爆炸问题。
  • 具备灵活的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合“开闭原则”。

1.4.2 缺点

  • 将抽象和实现分离会增加设计的难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

二、职责链模式

2.1 基本定义

职责链模式(Chain of Responsibility)也叫责任链模式,是一种对象行为型模式。为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
职责链模式核心是解决服务中先后执行处理关系,从而降低请求发送者和接受者之间的耦合关系。类似于击鼓传花。

2.2 问题引入

要用程序实现加薪、请假申请等需要层层审批的场景。比如向经理提加薪申请,经理没权利然后向总监上报,总监没权限然后向总经理汇报等。

2.2.1 问题分析

如果将管理者创建成为一个类,那么该类会具有太多的责任,比如经理、总监以及总经理的审批和上报功能,就违背了单一职责原则。而且以后的需求可能会增加新的管理类别,比如项目经理、部门经理、人事总监等,那么就势必会修改管理者类以完成扩展,就违背了开放封闭原则。

2.2.2 问题解决

将公司管理者的类别变成管理者的子类,可以通过多态性来化解分支带来的僵化。然后通过不同管理者之间建立管理关系实现请求的传递,使得请求的发送者和接收者解耦,可以让各服务模块更加清晰。处理者负责处理请求,客户只需要将请求发送到职责链,无需关心具体的处理细节。

其中有两个关键类:

  • Handler(请求类):用于定义一个处理请示的接口。
  • ConcreteHandler(具体处理者类):处理它所负责的请求,可访问它的后继者,如果能够处理就处理,否则就将请求转发给它的后继者。

2.2.3 代码实现

官方源码链接:
职责链模式Java实现
职责链模式python实现

2.3 应用场景:

责任链模式通常在以下几种情况使用。

  • 1.有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定。
  • 2.可动态指定一组对象处理请求,或添加新的处理者。
  • 3.在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。

2.4 优缺点

2.4.1 优点

  • 能够简化对象的相互连接,接收者和发送者都没有对方的明确信息,且链中的对象也不知道链的结构。
  • 避免了请求的发送者和接受者之间的耦合关系。
  • 能够随时修改请求的结构,增强了给对象指派职责的灵活性

2.4.2 缺点

  • 请求可能到了链的末端都得不到处理,或者因为没有正确配置得不到处理。
  • 较长的责任链可能会影响到系统的性能。

三、中介者模式

3.1 基本定义

中介者模式(Mediator Pattern)又叫又叫做调停者模式。它提供了一个中介类,用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们的交互。中介者模式属于行为型模式,用来降低多个对象和类之间的通信复杂性。

3.2 问题引入

刚进公司的新人需求其他部门同事帮忙是有困难的,但是通过主管协调就会简单许多。

3.2.1 问题分析

将系统分割成许多对象通常可以增加其复用性,但是对象之间大量的连接又使得对象之间的耦合性更强,导致对系统的行为进行较大的改动就比较困难。

3.2.2 问题解决

通过中介者对象,可以将系统的网状结构变成以中介者为中心的星型结构,使得对象之间的耦合度变低、扩展性增强,系统的结构不会因为新对象的引入造成大量的修改工作。
在工程中,有以下四个关键类:

  • Mediator(抽象中介者类):定义了同事对象到中介者对象的接口。
  • ConcreteMediator(具体中介者对象):实现抽象类的方法,知道所有具体同事类,并从具体同事接受消息,向其他具体同事发送命令。
  • Colleague(抽象同时类):用于定义抽象的同事对象。
  • ConcreteColleague(具体同时类):每个具体同事只知道自己的行为,而不了解其他同事类的情况,但是他们认识终结者对象。

3.2.3 代码实现

官方源码链接:
中介者模式Java实现
中介者模式python实现

3.3 应用场景

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

3.4 优缺点

3.4.1 优点

  • 中介者减少了各个业务类的耦合,使得可以独立的改变和复用各个业务类和中介者类。
  • 中介者的实现类控制了集中化,把对象群交互的复杂性变为中介者的复杂性。
  • 当系统出现多对多交互复杂的对象群,可以考虑使用中介这模式。

3.4.2 缺点

中介者会变得庞大且复杂,原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系,同事类越多,中介者的逻辑就越复杂。

参考

[1] datawhale大话设计模式教程云 - GitHub
[2] 秒懂设计模式之桥接模式(Bridge Pattern)
[3] 设计模式(十四)中介者模式

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

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

相关文章

第十二讲:生成树概念及STP技术应用

在传统的交换网络中,设备通过单条链路进行连接,当某一个点或是某一个链路发生故障时可能导致网络无法访问,解决这种问题的办法是在网络中提供冗余链路,但是交换机网络中的冗余链路会产生广播风暴、MAC地址失效等现象,最…

StarRocks 统计信息和 Cost 估算

导读:欢迎来到 StarRocks 源码解析系列文章,我们将为你全方位揭晓 StarRocks 背后的技术原理和实践细节,助你逐步了解这款明星开源数据库产品。本期 StarRocks 技术内幕将主要介绍 StarRocks 统计信息和 Cost 估算。 1.背景 在学习本文之前&…

mysql搭建主从复制

Mysql主从复制搭建过程: 主从需同步时间,主开启ntpd(ntp网络时间协议,它的端口号udp123)服务-----修改配置,从通过/usr/sbin/ntpdate 主ip(ntpdate包需要提前安装);主:开启中继二进…

整数划分问题(Java递归)

整数划分问题(Java递归) 文章目录整数划分问题(Java递归)0、 问题描述1、递归式2、代码3、参考0、 问题描述 整数划分问题 将正整数n表示成一系列正整数之和:nn1n2…nk,其中n1≥n2≥…≥nk≥1,k…

数字校园建设方案技术建议书

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容: 1.1 华为数字化…

“设计”小哥转行5G网络优化工程师!从零开始,三个月实现逆风翻盘~

5G网络优化,一个陌生的领域,对于一个毫无经验的小白来说,选择转行必定是需要勇气和决心的。好在,在决定选择5G网络优化的这一段时间里,老师给予了我最大的帮助和支持,包括从授课,到练习&#xf…

【Linux】基础IO(open、文件描述符、缓冲区)

文章目录1、从文件操作开始1.1 文件操作的系统调用接口1.2 文件描述符2、重定向3、缓冲区1、从文件操作开始 在C语言阶段,接触了很多库函数,如fopen、fclose、fread和fwrte,这些函数帮助了程序实现了内存与磁盘的输入输出功能。 不过之前都…

轻松搭建MQTT服务器,开发流程全透明

1、使用场景 MQTT服务器适用场景就不多介绍了,基本上实在IOT圈发光发热,所以说是特定领域的一个服务端软件,我们是用在车联网的环境里,用来发布消息。 2、选型 最早说需要使用mqtt服务器,然后我以为需要自己开发服务…

专利代理机构代理专利流程

代理申请专利流程是怎么样的? (一)咨询 1、 确定发明创造的内容是否属于可以申请专利的内容。 (二)技术交底 1、申请人向专利代理人提供有关发明创造的背景资料或委托检索有关内容; 2、申请人详细介绍发明创造的内容,帮助专利代理人充分理解发明创造…

【windows下nginx反向代理 ip地址和域名(含启动重启和关闭3个脚本)】 1.vue案例必须修改vue.config.js

例子1:代理vue的web服务器 1)去官网下nginx: download 下载windows版本nginx,并写好脚本,总体目录如下: StartNginx.bat // 启动脚本 echo off echo "nginx start !!!" nginx.exe -c conf/nginx.conf pause ReStartNginx.bat // 修改nginx.conf后重启脚…

redis学习笔记(基础)

Redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、…

飞腾FT-2000/4处理器+复旦微FPGA+国产操作系统解决方案

XM-1203-FPGA飞腾定制主板 自主可控,国产CPU、BIOS和国产Linux操作系统 性能稳定,FT-2000/4处理器 功能接口多样化,可扩展性强 高度集成,具有丰富的接口和电磁兼容性能. XM-1203-FPGA基于飞腾4 核CPU FT-2000/4的处理器板&#x…

【Javassist】快速入门系列09 当检测到数组创建时用代码块替换

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 07 当检测到字段被访问时使用语…

springboot整合之统一结果返回

特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整合…

树与二叉树(遍历)

一、树 树结构是一种非常重要的非线性数据结构,该结构中的一个数据元素可以有两个或者两个以上的直接后继元素。 1、树的定义 树是由 n(n>0)个有限结点组成一个具有层次关系的集合,当 n0时称为空树,当 n>0时称为非空树。 对于非空树来…

水上交通AIS常见问题解决方案

水上交通AIS常见问题解决方案 AIS无信号的几种情况 情况一:AIS未开启。 解决方法:开启AIS设备。 情况二:AIS开启但MMSI码和证书不一致。 解决方法:船长向直属海事部门申请MMSI码,并请专业人员将正确的MMSI码写入AIS设…

数据结构之堆的实现以及实现堆排序和建堆解决Top K问题

文章目录前言1.堆的相关介绍1.什么是堆2.堆的结构2.堆的相关接口具体实现1.堆的声明和堆的初始化2.堆插入数据和删除数据3.堆的其他函数接口3.堆的实际运用1.建堆算法2.堆的应用之堆排序3.堆解决Top k问题4.总结前言 之前对树的相关知识概念进行了简单介绍,本文将实…

odps-jdbc提交MaxCompute数据源SQL报错HTTP/1.0 is not allowed

概述 最近负责的一款数据产品。有个功能:选择某个数据源,比如阿里云的MaxCompute数据源,然后手写SQL,点击自动生成字段(即获取前置SQL里的查询字段。前置SQL可以有drop then create table动作子句,但是最后…

【PS-选区速成】快速选择工具、魔棒工具、对象选择工具

目录 快速选择工具 1、位置 2、3种模式:新选区、添加到选区、从选区减去 3、画笔的设置参数 画笔大小:识别的范围 硬度:边缘的识别能力 间距:识别的连贯程度 跟【选区工具】配套使用的快捷键 1、按【ALT】减区 2、放大…

数据结构之排序【快速排序和归并排序的非递归代码实现及分析】

引言: 今天因为要写论文,所以现在有点迟了,并且此时是北京时间:2022/12/28/1:41 ,我发现晚睡我真的是专业的,当然睡觉我也是专业的,懂的都懂,现在有点迟加上天大寒,手指不可屈伸&am…