设计模式- 中介者模式(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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的

Java高效实现PowerPoint转PDF的示例详解

《Java高效实现PowerPoint转PDF的示例详解》在日常开发或办公场景中,经常需要将PowerPoint演示文稿(PPT/PPTX)转换为PDF,本文将介绍从基础转换到高级设置的多种用法,大家... 目录为什么要将 PowerPoint 转换为 PDF安装 Spire.Presentation fo

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu