技术成神之路:设计模式(十五)中介者模式

server/2024/9/29 21:21:40/

介绍

中介者模式(Mediator Pattern)是一种行为型设计模式,用于减少对象之间的复杂通信和依赖。它通过引入一个中介者对象来封装对象之间的交互,从而使得对象之间不直接相互依赖,而是通过中介者进行通信。

1. 定义


中介者模式将对象之间的通信封装到一个中介者对象中,使各对象不再直接引用彼此,从而减少对象之间的耦合度。

2. 主要作用


  • 解耦:降低对象之间的依赖关系。
  • 集中控制:所有交互逻辑都集中在中介者中,便于管理。

3. 解决的问题


  • 对象之间的复杂交互导致系统难以维护和扩展。
  • 对象之间存在大量的直接引用,导致系统耦合度高。
  • 需要集中管理对象之间的交互逻辑。

4. 模式原理


包含角色:

  1. 中介者(Mediator):定义一个接口,用于与各同事对象进行通信。
  2. 具体中介者(ConcreteMediator):实现中介者接口,具体协调各同事对象之间的交互。
  3. 同事类(Colleague):各个相互通信的对象,通过中介者与其他同事对象通信。
  4. 具体同事类(ConcreteColleague):实现同事类接口,与中介者进行交互。

UML类图:
在这里插入图片描述
示例:
以下是一个简单的聊天室示例

// 中介者接口
interface ChatMediator {void sendMessage(String message, User user);void addUser(User user);
}// 具体中介者类
class ChatRoom implements ChatMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void addUser(User user) {this.users.add(user);}@Overridepublic void sendMessage(String message, User user) {for (User u : users) {// 消息不发送给自己if (u != user) {u.receive(message);}}}
}// 同事类
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receive(String message);
}// 具体同事类
class ConcreteUser extends User {public ConcreteUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(this.name + " 发送消息: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(this.name + " 接收到消息: " + message);}
}

客户端代码:创建了一个ChatRoom(具体中介者)和多个用户,通过中介者来进行消息传递。

public class MediatorPatternDemo {public static void main(String[] args) {ChatMediator chatMediator = new ChatRoom();User user1 = new ConcreteUser(chatMediator, "Alice");User user2 = new ConcreteUser(chatMediator, "Bob");User user3 = new ConcreteUser(chatMediator, "Charlie");User user4 = new ConcreteUser(chatMediator, "Diana");chatMediator.addUser(user1);chatMediator.addUser(user2);chatMediator.addUser(user3);chatMediator.addUser(user4);user1.send("Hello, everyone!");}
}

打印输出

Alice 发送消息: Hello, everyone!
Bob 接收到消息: Hello, everyone!
Charlie 接收到消息: Hello, everyone!
Diana 接收到消息: Hello, everyone!

中介者模式也不难理解,就是起了一个在中间调节作用,比如你去租房,大多数都是去找中介,而你和其他房东在这里都是具体同事类,是不是一下就清晰了好多。

中介者模式又叫调解者模式主要是因为它的核心功能是调解和协调多个对象之间的交互。中介者作为一个中间层,负责管理对象之间的通信,减少它们之间的直接依赖,从而有效地调解各个对象的关系。这种调解作用使得系统更加灵活,便于后期的维护和扩展。

看到这里,有没有发现它和面向切面编程(AOP)很像,在程序中都是起了一个中间者的作用,哈哈,是有一点像,但它们的功能和逻辑差别还是挺大滴,一个是通过中介者解耦对象间的交互,一个是通过切面解耦横切关注点,这里了解下就行。

5. 优缺点


优点:

  1. 降低耦合度,便于维护。
  2. 中介者集中管理,逻辑清晰。

缺点:

  1. 中介者成为了系统的单点故障。
  2. 可能导致中介者过于复杂,难以管理。

6. 应用场景


UI组件交互:如在聊天应用中,各个组件(消息、用户列表等)通过中介者管理交互。
中介服务:在微服务架构中,各服务通过一个API网关进行通信。

7. 总结


中介者模式通过引入一个中介者对象,将对象之间的复杂通信逻辑封装起来,从而降低对象之间的耦合度,提高系统的可维护性和可扩展性。虽然中介者模式能显著优化对象间的交互,但也需要注意中介者对象的设计,以避免其逻辑过于复杂和成为性能瓶颈。适用于需要集中管理对象交互逻辑的场景,如GUI应用、聊天室系统和工作流管理系统等。


http://www.ppmy.cn/server/124656.html

相关文章

docker和docker-compose安装

文章目录 一、问题背景二、脚本代码三、可能出现的问题四、手动安装1、上传文件2、授权3、检查版本 一、问题背景 我们在linux上通过docker部署应用时&#xff0c;需要先安装docker和docker-compose&#xff0c;每次安装时&#xff0c;都要参考文章&#xff0c;进行一系列操作&…

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言的兼…

做了一个 byd 编辑器插件,用户再也不汪汪叫了。。。

引言 大家好&#xff0c;我是程序员 K.N&#xff0c; 一个试图用代码和世界重新打结的前端小白~ 先叠个甲&#xff0c;byd ByteMD&#xff0c;小小的标题党一下&#xff0c;各位看官老爷轻喷。 前段时间&#xff0c;我们团队做了个面试刷题工具——面试鸭&#xff0c;而我也…

【linux】进度条

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.屏幕缓冲区换行&#xff08;LF, \n&#xff09;和回车&#xff08;CR, \r&#xff09;换行回车在屏幕缓冲区中的作用代码块1&#xff1a;代码块2&#xff1a; 02.进度条优化版…

2024年7天自学网络安全(黑客技术)进阶手册。

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…

PHP include和require的区别

1. 基本概念 include 和 require 是PHP中用于在当前文件中包含&#xff08;或插入&#xff09;另一个文件内容的两个语句。它们的主要目的是代码复用&#xff0c;通过包含&#xff08;或引用&#xff09;外部文件的方式&#xff0c;使得PHP代码更加模块化和易于管理。然而&…

python中的assert语句

1.什么是assert 程序运行过程中,所有变量的当前值组合构成了“状态“; 每执行一段程序,状态就发生变化;如果程序有逻辑错误的bug,必定在处变量值的组合不符合预期,处于错误状态; 将对变量的预期写为断言,可以定位复杂的逻辑错误。 语法: assert <表达式> [, …

使用Postman工具接口测试

文章目录 一、接口1.1 接口的概念1.2 接口的类型 二、接口测试2.1 概念2.2 原理2.3 特点 三、HTTP协议3.1 http协议简介3.2 URL格式3.3 HTTP请求3.3.1 请求行3.3.2 请求头3.3.3 请求体 3.4 HTTP响应3.4.1 状态行3.4.2 响应头3.4.3 响应体 3.4 传统风格接口3.5 RESTful风格接口 …