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

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实