设计模式--中介者模式【行为型模式】

news/2025/2/21 19:02:31/

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

设计模式–单例模式【创建型模式】

设计模式–工厂方法模式【创建型模式】

设计模式–抽象工厂模式【创建型模式】

设计模式–建造者模式【创建型模式】

设计模式–原型模式【创建型模式】

设计模式–适配器模式【结构型模式】

设计模式–装饰器模式【结构型模式】

设计模式–代理模式【结构型模式】

设计模式–外观模式(门面模式)【结构型模式】

设计模式–桥接模式【结构型模式】

设计模式–组合模式【结构型模式】

设计模式–享元模式【结构型模式】

设计模式–策略模式【行为型模式】

设计模式–模板方法模式【行为型模式】

设计模式–观察者模式【行为型模式】

设计模式–迭代器模式【行为型模式】

设计模式–责任链模式【行为型模式】

设计模式–命令模式【行为型模式】

设计模式–备忘录模式【行为型模式】

设计模式–状态模式【行为型模式】

设计模式–访问者模式【行为型模式】

什么是中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它通过使用一个中介对象来封装一系列对象之间的交互方式,中介者使得各对象之间不需要显式地相互引用,从而降低对象之间的耦合度,使得系统可以更加灵活地进行维护和扩展,中介者模式的本质其实就是封装对象之间的交互过程。

中介者模式的组成部分

  • 抽象中介者:定义了通用接口,用于与各个同事对象进行通信。这个接口通常包含了同事对象之间交互的方法。
  • 具体中介者:实现了抽象中介者的接口,它包含了对各个同事对象的引用,并通过协调这些同事对象来实现具体的交互逻辑。
  • 抽象同事类:定义了同事对象的接口,每个同事对象都需要实现这个接口,并且在接口中定义了同事对象与中介者进行通信的方法。
  • 具体同事类:实现了抽象同事类的接口,每个具体同事类代表一个实际的对象,它们通过中介者来与其他同事对象进行交互。

中介者模式案例演示

中介者模式在生活中也有很多应用场景,例如物流公司、商家、用户等的场景,网购支付的场景,有支付宝、微信、云闪付支付,用户只需要发起支付,由支付平台调用支付宝、微信、云闪付支付,这其中支付平台就是中介者的角色,支付宝、微信、云闪付就是具体的同事类,下面我们使用代码来演示这个网购支付场景这个案例。

PayMediator(抽象中介者)

PayMediator 中介者定义了注册支付方式和付款的接口,具体代码如下:

public interface PayMediator {//注册付款方式void registerPayMethod(PayMethod payMethod);//付款void payment(String payMethodName, int amount);
}

PayMediatorImpl(具体中介者)

PayMediatorImpl 中介者实现了抽象中介者,持有一个支付方式的容器,并重写了注册支付方式和付款的接口,具体代码如下:

public class PayMediatorImpl implements  PayMediator{//支付方式容器private Map<String,PayMethod> payMethodMap=new HashMap<>();@Overridepublic void registerPayMethod(PayMethod payMethod) {payMethodMap.put(payMethod.getPayMethodName(),payMethod);}@Overridepublic void payment(String payMethodName, int amount) {PayMethod payMethod = payMethodMap.get(payMethodName);//发起支付payMethod.payProcess(amount);}
}

PayMethod(抽象同事类)

PayMethod 支付方式,也就是抽象同事类,具体代码如下:

public abstract class PayMethod {private  String payMethodName;public String getPayMethodName() {return payMethodName;}public void setPayMethodName(String payMethodName) {this.payMethodName = payMethodName;}public PayMethod( String payMethodName) {this.payMethodName = payMethodName;}//处理付款 金额public abstract void payProcess(int amount);
}

Alipay(具体同事类)

Alipay 支付宝支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:

public class Alipay extends PayMethod {public Alipay(String payMethodName) {super(payMethodName);}@Overridepublic void payProcess(int amount) {System.out.println("支付宝支付:" + amount + "元");}
}

WeChatPay(具体同事类)

WeChatPay 微信支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:

public class WeChatPay extends PayMethod {public WeChatPay(String payMethodName) {super(payMethodName);}@Overridepublic void payProcess(int amount) {System.out.println("微信支付:" + amount + "元");}
}

CloudQuickPassPay(具体同事类)

CloudQuickPassPay 云闪付支付,实现了 PayMethod 支付的方法,是一个具体同事类,具体代码如下:

public class CloudQuickPassPay extends PayMethod {public CloudQuickPassPay(String payMethodName) {super(payMethodName);}@Overridepublic void payProcess(int amount) {System.out.println("云闪付支付:" + amount + "元");}
}

MediatorClient(客户端)

MediatorClient 代码如下:

public class MediatorClient {public static void main(String[] args) {//访问者PayMediatorImpl payMediator = new PayMediatorImpl();//支付宝支付Alipay alipay = new Alipay("支付宝");//微信支付WeChatPay weChatPay = new WeChatPay("微信");//云闪付支付CloudQuickPassPay cloudQuickPassPay = new CloudQuickPassPay("云闪付");//注册支付宝支付payMediator.registerPayMethod(alipay);//注册微信支付payMediator.registerPayMethod(weChatPay);//注册云闪付支付payMediator.registerPayMethod(cloudQuickPassPay);//中介者调用支付宝支付payMediator.payment("支付宝", 10);//中介者调用微信支付payMediator.payment("微信", 100);//中介者调用云闪付支付payMediator.payment("云闪付", 1000);}}

执行结果如下:

支付宝支付:10元
微信支付:100元
云闪付支付:1000元

可以看到我们并没有直接调用支付宝、微信、云闪付支付,而是通过中介者实现的,但最终还是正常完成了支付,结果符合预期。

中介者模式的优缺点

优点:

  • 解耦了对象之间的直接依赖关系,客户端只需要与中介者交互,由中介者来调用对应的方法,完成业务逻辑。
  • 对象之间的通信通过中介者进行,当系统需要添加新的对象或者修改对象之间的交互方式时,只需要在中介者类中进行相应的修改,而不需要在多个相关对象中进行复杂的修改,提升了代码的可维护性。
  • 降低了对象之间相互调用的复杂度,将一对多的调用关系转换为了一对一的调用关系,客户端只需要关注与中介者的交互。
  • 中介者将系统中的对象的交互行为集中控制在中介者对象中,这可以更好地管理和控制系统中对象的行为,让系统更加结构化。

缺点:

  • 中介者模式的实现较为复杂,对系统研发人员有较高的要求。
  • 在某种程度上来说降低了对象的复用性,因为中介者模式将对象封装起来了,对象的访问依赖于中介者。

中介者模式的使用场景

  • 系统中的对象之间存在复杂的交互行为,可以考虑使用中介者模式
  • 希望通过减少对象之间的直接耦合来提高系统的灵活性和可扩展性时,可以考虑使用中介者模式
  • 当需要对对象之间的交互进行集中管理和控制时,可以考虑使用中介者模式

总结:本篇分享了中介者设计模式的相关知识,个人感觉中介者模式还是有一点复杂的,我使用了支付场景的案例进行了代码演示,希望可以帮助到不太熟悉中介者模式的朋友。

如有不正确的地方欢迎各位指出纠正。


http://www.ppmy.cn/news/1573957.html

相关文章

芯谷D2038:高集成度六通道电子音量控制电路的音频解决方案

在多通道音频系统中&#xff0c;音量控制的便捷性和精准性是提升用户体验的关键。芯谷科技推出的D2038是一款专为六通道音频功放设计的电子音量控制电路&#xff0c;凭借其高集成度和简单易用的特性&#xff0c;成为音频设备设计中的理想选择。 一、D2038的核心特性 1. 高集成…

当前就业形势下C++方向后端开发学习指南

文章目录 1. C后端开发的职业方向1.1 C的应用领域1.2 后端开发的职业选择 2. 当前就业形势分析2.1 C开发者的市场需求2.2 C开发者的薪资水平 3. 学习路线3.1 入门阶段&#xff1a;掌握基础知识3.2 进阶阶段&#xff1a;掌握后端开发的核心技术3.2.1 数据库与C3.2.2 网络编程 3.…

详解同为科技桌面PDU系列产品特点

同为科技的桌面PDU系列产品是依据自身在电气联接领域25年专业积累并精心设计&#xff0c;产品采用模块化结构&#xff0c;实现各种功能、输出插口、输入方式可根据用户需求以模块组合的方式构建定制化产品。 桌面PDU产品特点 工业级材质和结构设计 桌面PDU系列产品采用一体成…

C++栈与队列:数据结构的“单行道”与“流水线

C栈与队列&#xff1a;数据结构的“单行道”与“流水线” 开篇小故事&#xff1a;火车站的两条轨道 想象一个火车站有两条特殊轨道&#xff1a; 轨道A&#xff08;栈&#xff09;&#xff1a;火车只能从同一端进出&#xff0c;最后进入的车厢必须先离开。轨道B&#xff08;队…

PyQt加载UI文件

1.动态加载 import sys from PySide6 import QtCore,QtWidgets from PySide6.QtWidgets import * from PySide6.QtUiTools import QUiLoaderclass readfile(QWidget):def __init__(self):super().__init__()self.uiQUiLoader().load("test.ui",self) self.__c…

CentOS7 离线安装 Postgresql 指南

一、背景 服务器通常都是离线内网环境&#xff0c;想要通过联网方式一键下载安装 Postgresql 不太现实&#xff0c;本文将介绍如何在 CentOS7 离线安装 Postgresql&#xff0c;以及遇到困难如何解决。 二、安装包下载 先在本地下载好 rpm 包&#xff0c;再通过 ftp 上传到服…

Python 高级特性-迭代

目录 迭代 练习 小结 迭代 如果给定一个list或tuple&#xff0c;我们可以通过for循环来遍历这个list或tuple&#xff0c;这种遍历我们称为迭代&#xff08;Iteration&#xff09;。 在Python中&#xff0c;迭代是通过for ... in来完成的&#xff0c;而很多语言比如C语言&a…

EasyPoi系列之通用导入接口设计

EasyPoi系列之通用导入接口设计 1 背景2 分析及设计2.1 标准导入交互分析2.2 设计2.2.1 导入模板生成接口2.2.2 数据导入接口 3、代码实现3.1 人员实体-PersonEntity3.2 定义数据保存通用接口-ExcelImporter3.3 人员数据保存实现- PersonService3.4 建立业务与实体及保存实现类…