当前位置: 首页 > news >正文

中介者模式(行为型)

目录

一、前言

二、中介者模式

三、总结


一、前言

        中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

        中介者模式由以下角色组成:

Mediator(中介者):

定义一个接口,用于与各同事对象进行通信。这个接口主要用来协调各同事对象之间的交互

Concrete Mediator(具体中介者):

实现中介者接口,并协调各同事对象之间的交互。具体中介者通常会持有对所有同事对象的引用,并在这些对象之间进行调度和通信

Colleague(同事):

定义一个与中介者进行通信的接口。同事对象知道中介者对象,并且所有的交互都通过中介者来进行

Concrete Colleague(具体同事):

实现同事接口,具体同事通过中介者与其他同事对象进行交互,而不是直接与其他同事对象通信

        整个中介者模式的结构图:

二、中介者模式

        首先编写中介者抽象类Mediator.class:

public abstract class Mediator {public abstract void add(Colleague colleague);public abstract void operation(Colleague colleague, String message);}

        编写具体的中介者类ConcreteMediator.class:

public class ConcreteMediator extends Mediator{private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void add(Colleague colleague) {if (!colleagues.contains(colleague)) {colleagues.add(colleague);colleague.setMediator(this);}}@Overridepublic void operation(Colleague colleague, String message) {for (Colleague coll : colleagues) {if (!coll.equals(colleague)) {coll.receive(message);}}}
}

        编写抽象同事类Colleague.class:

public abstract class Colleague {protected Mediator mediator;public void setMediator(Mediator mediator) {this.mediator = mediator;}public abstract void receive(String message);public abstract void send(String message);
}

        编写具体的同事类ConcreteColleagueOne.class、ConcreteColleagueTwo.class:

public class ConcreteColleagueOne extends Colleague{@Overridepublic void receive(String message) {System.out.println("具体同事类 ConcreteColleagueOne 接收请求:" + message);}@Overridepublic void send(String message) {System.out.println("具体同事类 ConcreteColleagueOne 发送请求:" + message);mediator.operation(this, message);}
}public class ConcreteColleagueTwo extends Colleague{@Overridepublic void receive(String message) {System.out.println("具体同事类 ConcreteColleagueTwo 接收请求:" + message);}@Overridepublic void send(String message) {System.out.println("具体同事类 ConcreteColleagueTwo 发送请求:" + message);mediator.operation(this, message);}
}

        编写客户端类Client.class: 

public class Client {public static void main(String[] args) {Mediator concreteMediator = new ConcreteMediator();Colleague concreteColleague1 = new ConcreteColleagueOne();Colleague concreteColleague2 = new ConcreteColleagueTwo();concreteMediator.add(concreteColleague1);concreteMediator.add(concreteColleague2);concreteColleague1.send("Hello1");concreteColleague2.send("Hello2");}
}

        通过代码可以看出,抽象同事类中拥有抽象中介者类,每个具体的同事类中会调用抽象中介类的方法,由具体的中介者实现。

        代码测试结果:

三、总结

        优点与缺点

优点:

降低耦合性:

通过引入中介者对象,同事对象不再需要显式地引用彼此。它们只需要与中介者对象通信,从而降低了对象之间的耦合度,使得代码更易于维护和扩展

集中控制:

中介者模式将对象之间的交互逻辑集中到一个中介者对象中,简化了对象的管理和协调,便于修改和扩展交互逻辑。

提高可读性和可维护性:

将复杂的对象交互逻辑从对象本身中提取出来放到中介者中,使得每个对象的职责更加单一,代码更清晰,更易于理解和维护。

灵活性和扩展性:

通过改变或扩展中介者对象,可以很方便地改变或扩展系统的交互行为,而不需要修改各个同事对象

缺点:

复杂性增加:

引入了一个新的中介者对象,增加了系统的复杂性。中介者对象本身可能会变得复杂,因为它需要处理所有的交互逻辑

可能导致性能问题:

如果中介者对象处理了大量的交互逻辑,可能会成为性能瓶颈,因为所有的交互都需要通过中介者来处理。

难以维护:

随着系统的规模扩大,中介者对象的逻辑可能变得过于复杂,难以维护。中介者本身可能会变成一个“上帝对象”,负责太多的职责。

        应用场景

GUI框架:

在图形用户界面(GUI)中,中介者模式常用于处理各个组件(如按钮、文本框、复选框等)之间的交互。例如,一个表单中多个输入字段之间的相互启用/禁用状态的管理

聊天室应用:

在即时通讯应用中,中介者模式可以用来处理用户之间的消息传递。聊天室服务器可以作为中介者,负责接收消息并分发给其他用户

航空交通管制:

航空交通管制员作为中介者,负责协调不同飞机之间的通信和导航,确保它们安全地在空域中飞行

模块化系统:

在模块化软件系统中,不同模块之间的通信可以通过中介者模式来实现,从而使得各个模块可以独立开发和维护

工作流引擎:

在业务流程管理(BPM)系统中,中介者模式可以用于协调不同步骤和任务之间的交互,确保按照预定的流程顺序执行

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【JVM】JVM调优练习-随笔
  • 从C向C++20——C++11(1)
  • Sentinel规则持久化Push模式两种实现方式
  • Redis 关于内存碎片的解决方法
  • bug等级和优先级
  • 设计模式学习(二)工厂模式——抽象工厂模式+注册表
  • Token Labeling(NeurIPS 2021, ByteDance)论文解读
  • 数据结构--二叉树遍历
  • SAP 消息输出 - Adobe Form
  • C++相关概念和易错语法(22)(final、纯虚函数、继承多态难点)
  • Odoo创建一个自定义UI视图
  • sentinel网关限流配置及使用
  • 一篇就够mysql高阶知识总结
  • UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)
  • C语言丢失精度 如何实现高精度计算
  • 2017年终总结、随想
  • Js基础——数据类型之Null和Undefined
  • magento 货币换算
  • Meteor的表单提交:Form
  • nodejs调试方法
  • webgl (原生)基础入门指南【一】
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 构造函数(constructor)与原型链(prototype)关系
  • 你不可错过的前端面试题(一)
  • 使用Swoole加速Laravel(正式环境中)
  • 我感觉这是史上最牛的防sql注入方法类
  • 学习HTTP相关知识笔记
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​​​【收录 Hello 算法】9.4 小结
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 数据结构
  • #Lua:Lua调用C++生成的DLL库
  • #pragam once 和 #ifndef 预编译头
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (八)c52学习之旅-中断实验
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core 管理用户机密
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net 知识杂记
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @PreAuthorize注解
  • @SentinelResource详解
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • []FET-430SIM508 研究日志 11.3.31