设计模式- 中介者模式(Mediator Pattern)结构|原理|优缺点|场景|示例

本文主要是介绍设计模式- 中介者模式(Mediator Pattern)结构|原理|优缺点|场景|示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。中介者使各个对象不需要显式地相互引用,而是通过中介者进行间接通信,从而降低系统的复杂性和提高可维护性。

结构: 中介者模式的主要组成部分包括:

  1. Mediator(中介者):定义一个接口,用于同事对象之间的通信。具体中介者通过实现该接口,来协调各同事对象的行为。
  2. Colleague(同事类):每个同事类都了解中介者,并且通过中介者与其他同事通信,而不是直接与其他同事通信。每个同事类都维持一个对中介者的引用。
  3. ConcreteMediator(具体中介者):具体中介者实现中介者接口,它通常会持有多个同事对象的引用,用于协调和管理同事之间的交互。

原理:

  • 同事对象不再直接相互引用,而是将交互请求发送给中介者。
  • 中介者接收到请求后,根据请求内容和当前状态,决定如何响应或转发请求给适当的同事对象。
  • 通过中介者,可以集中管理对象间的交互,降低了对象间的耦合度,使得系统易于扩展和维护。

优缺点:

 优点:

  • 减少了类间直接耦合,使得对象易于复用和维护。
  • 中央控制,使得复杂系统中的对象交互更加清晰和灵活。
  • 方便添加新的交互方式或同事类,符合开闭原则。

缺点:

  • 中介者集中了控制权,一旦中介者出现问题,可能会影响整个系统。
  • 随着同事类的增多,中介者可能会变得复杂和难以管理。

应用场景:

  • 当一个系统中对象之间的交互非常多且复杂,导致难以理解各个对象的职责时。
  • 需要控制和协调多个对象间交互,避免对象间的紧耦合时。
  • 在图形用户界面(GUI)开发中,协调多个组件之间的交互。

代码示例(以Java为例) 

// 抽象中介者
interface ChatRoom {void sendMessage(String message, User user);
}// 具体中介者:聊天室
class ConcreteChatRoom implements ChatRoom {@Overridepublic void sendMessage(String message, User user) {for (User u : users) {if (!u.equals(user)) {u.receive(message);}}}// 管理用户列表private List<User> users = new ArrayList<>();public void addUser(User user) {users.add(user);}
}// 抽象同事类
abstract class User {protected String name;protected ChatRoom chatRoom;public User(String name, ChatRoom chatRoom) {this.name = name;this.chatRoom = chatRoom;}abstract void receive(String message);
}// 具体同事类:用户
class ConcreteUser extends User {public ConcreteUser(String name, ChatRoom chatRoom) {super(name, chatRoom);}@Overridevoid receive(String message) {System.out.println(name + " received: " + message);}public void sendMessage(String message) {chatRoom.sendMessage(message, this);}
}// 示例使用
public class MediatorPatternDemo {public static void main(String[] args) {ChatRoom chatRoom = new ConcreteChatRoom();User alice = new ConcreteUser("Alice", chatRoom);User bob = new ConcreteUser("Bob", chatRoom);chatRoom.addUser(alice);chatRoom.addUser(bob);alice.sendMessage("Hello, Bob!");bob.sendMessage("Hi, Alice!");}
}

 在这个例子中,ChatRoom作为中介者,管理着用户(User)之间的消息发送。用户之间并不直接通信,而是通过调用聊天室的sendMessage方法来间接通信。这样,即使增加新的用户或改变消息传播逻辑,也只需修改ChatRoom类,而无需修改用户类,符合中介者模式的设计思想。

这篇关于设计模式- 中介者模式(Mediator Pattern)结构|原理|优缺点|场景|示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947704

相关文章

Spring框架中@Lazy延迟加载原理和使用详解

《Spring框架中@Lazy延迟加载原理和使用详解》:本文主要介绍Spring框架中@Lazy延迟加载原理和使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、@Lazy延迟加载原理1.延迟加载原理1.1 @Lazy三种配置方法1.2 @Component

python+OpenCV反投影图像的实现示例详解

《python+OpenCV反投影图像的实现示例详解》:本文主要介绍python+OpenCV反投影图像的实现示例详解,本文通过实例代码图文并茂的形式给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前言二、什么是反投影图像三、反投影图像的概念四、反向投影的工作原理一、利用反向投影backproj

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令