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

设计模式行为型——中介者模式

目录

什么是中介者模式

中介者模式的实现

中介者模式角色

中介者模式类图

中介者模式代码实现

中介者模式的特点

优点

缺点

使用场景

注意事项

实际应用


什么是中介者模式

        中介者模式(Mediator Pattern)属于行为型模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,且可以独立地改变它们之间的交互。

        中介者模式又叫调停者模式,是一种对象行为型模式。

中介者模式的实现

中介者模式角色

  1. 抽象中介者角色(Mediator):抽象中介者角色定义统一的接口,以及一个或者多个事件方法,用于各同事角色之间的通信。
  2. 具体中介者角色(ConcreteMediator):实现了抽象中介者所声明的事件方法,协调各同事类之间的行为,持有所有同事类对象的引用。
  3. 抽象同事角色(Colleague):定义了抽象同事类,持有抽象中介者对象的引用。
  4. 具体同事角色(ConcreteColleague):继承抽象同事类,实现自己业务,通过中介者跟其他同事类进行通信,都需要认识中介者。

中介者模式类图

中介者模式代码实现

抽象中介者角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/
public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}
}

具体中介者角色

    package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}}

抽象同事角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象同事角色 抽象同事类* @date 2023/08/04 09:21:50*/
public abstract class Colleague {/*** 抽象中介者引用*/protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}/*** 数据更新方法*/public abstract void update();/*** 数据更改方法*/public abstract void changed();
}

具体同事角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体同事角色 具体同事小A* @date 2023/08/04 09:24:46*/
public class ConcreteColleagueA extends Colleague{public ConcreteColleagueA(Mediator mediator){super(mediator);}@Overridepublic void update() {System.out.println("更新同事小A");}@Overridepublic void changed() {System.out.println("同事小A数据更改");mediator.operation(this);}
}
package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体同事角色 具体同事小B* @date 2023/08/04 09:24:46*/
public class ConcreteColleagueB extends Colleague{public ConcreteColleagueB(Mediator mediator){super(mediator);}@Overridepublic void update() {System.out.println("更新同事小B");}@Overridepublic void changed() {System.out.println("同事小B数据更改");mediator.operation(this);}
}

测试代码

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/
public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}
}

测试截图

 

中介者模式的特点

优点

  1. 解耦对象之间的交互:中介者模式将对象间的交互逻辑封装到中介者对象中,使得各个对象之间的关系变得松耦合,减少了对象之间的直接依赖。
  2. 集中控制交互逻辑:中介者模式通过集中控制对象间的交互逻辑,使得代码更加清晰可维护,易于扩展和修改。
  3. 简化对象间的通信:中介者模式将对象间的通信封装到中介者对象中,对象只需要关注自身的业务逻辑,无需了解其它对象的具体实现细节。

缺点

  1. 中介者对象过于复杂:随着系统的复杂性增加,中介者对象可能会变得庞大复杂,维护和理解起来相对困难。
  2. 增加了系统的单一点故障:中介者对象负责协调对象之间的交互,一旦中介者对象出现问题,可能会影响系统的稳定性。

使用场景

  1. 多个对象之间存在复杂的交互关系:当对象之间存在复杂的交互逻辑,并且彼此之间的依赖关系较高时,可以考虑使用中介者模式。
  2. 需要集中控制对象间交互逻辑的情况:当需要集中管理和控制多个对象的交互逻辑时,可以使用中介者模式简化系统的设计。

注意事项

  1. 中介者模式需要注意中介者对象的设计和组织方式,以及与其他对象的交互关系,避免中介者对象过于庞大和复杂。
  2. 不要滥用中介者模式,只有在对象间的交互逻辑较为复杂、耦合度较高时才考虑使用中介者模式。

实际应用

  1. 聊天室:聊天室中的用户可以通过中介者对象发送消息和接收消息,中介者负责将消息传递给其他用户。
  2. MVC框架:在MVC框架中,控制器作为中介者对象,接收用户的请求并协调模型和视图之间的交互。
  3. 航空管制系统:航空管制系统中的空中交通管制中心可以看作是中介者,负责协调各个飞机的航行和地面设施之间的交互。


更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

http://www.lryc.cn/news/109786.html

相关文章:

  • Vue——formcreate表单设计器自定义组件实现(二)
  • 人脸验证(Face verification) 和 人脸识别(Face recognition) 的区别
  • 前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)
  • 数据可视化入门指南
  • React 18 响应事件
  • 面试总结-c++
  • Spring(九) - 解惑 spring 嵌套事务.2
  • Android Studio API 33 获取当前连接的WIFI名称
  • ICCV 2023 | 半监督三维目标检测新SOTA:密集匹配和量化补偿
  • python+django+mysql项目实践三(用户管理)
  • Java多线程 | 操作线程的方法详解
  • 【ConcurrentHashMap1.7源码】十分钟带你深入ConcurrentHashMap并发解析
  • 程序框架-事件中心模块-观察者模式
  • 通过AOP的ProceedingJoinPoint获取方法信息
  • 【JavaSE】初步认识类和对象
  • python中的matplotlib画饼图(数据分析与可视化)
  • 用Rust实现23种设计模式之 职责链模式
  • 进销存管理中的技术创新和数字化转型
  • 与“云”共舞,联想凌拓的新科技与新突破
  • 【超细节】Vue3组件事件怎么声明,defineEmits与emit
  • java Selenium 实现简单的网页操作
  • (数据库系统概论|王珊)第一章绪论-第一节:数据库系统概论
  • 深入理解TCP三次握手:连接可靠性与安全风险
  • 基于人工智能的智能矿山解决方案
  • vue-cli3项目优化
  • Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting
  • git bash 安装sdkadmin
  • 如何在IEEE论文中添加伪代码pseudocode
  • 【css】css隐藏元素
  • JUC并发编程(二)ForkJoinPool、Future、CompletableFuture、CAS