行为型模式-中介者模式

embedded/2024/9/22 23:33:04/

中介者模式是什么

      中介者模式是一种行为设计模式,它允许对象之间通过一个中介对象进行通信,而不是直接相互引用。中介者模式的目的是减少对象之间的耦合度,将多个对象之间的复杂关系转移到一个中介者对象中,从而简化对象之间的交互。

中介者模式中,对象之间不再直接相互调用,而是通过中介者对象进行通信。当一个对象发生变化时,它不会直接通知其他对象,而是通过中介者来通知其他相关对象。中介者负责处理对象之间的交互逻辑,将对象之间的通信进行集中管理。这样,对象之间的耦合度更低,且易于扩展和维护。

中介者模式适用于对象之间的交互非常复杂的情况,当对象之间的交互逻辑变得混乱且难以维护时,可以使用中介者模式来简化和优化交互关系。它可以提高系统的可复用性和灵活性,提供更好的代码可读性和可维护性。

中介者模式优缺点

    

中介者模式的优点包括:

  1. 降低了对象之间的耦合性:中介者模式通过将对象之间的交互逻辑集中到中介者对象中,使得各个对象之间不需要直接相互引用,从而降低了对象之间的耦合性。

  2. 复用性和扩展性好:中介者模式将对象之间的交互逻辑封装在中介者对象中,当需要添加新的对象时,只需要在中介者对象中添加相应的处理逻辑即可,不需要修改现有对象的代码,因此具有很好的扩展性。

  3. 可以简化对象的交互过程:中介者模式将对象之间的交互逻辑集中管理,可以简化对象之间的交互过程,使得交互逻辑更加清晰明确。

中介者模式的缺点包括:

  1. 中介者对象过于复杂:由于中介者对象需要处理多个对象之间的交互逻辑,可能会导致中介者对象变得比较复杂,难以维护和扩展。

  2. 增加了系统的复杂性:引入中介者对象会增加系统的复杂性,可能会导致系统的理解和维护变得困难。

  3. 可能导致性能问题:由于中介者对象需要处理多个对象之间的交互逻辑,可能会导致性能问题,特别是在系统对象较多、交互逻辑较复杂的情况下。

中介者模式应用场景

  1. 当一个系统中对象之间有复杂的相互依赖关系,导致它们之间的通信难以维护和理解时,可以使用中介者模式将它们解耦。
  2. 当一个对象的行为依赖于其他多个对象的情况下,可以使用中介者模式将这些对象的交互逻辑集中在中介者中,避免对象之间的直接交互。
  3. 当需要通过一个中间对象来集中管理、控制和协调一组相关对象的行为时,可以使用中介者模式。这样可以简化系统的结构,增强可维护性和灵活性。
  4. 当系统中的多个对象共享一些公共资源或信息时,可以使用中介者模式来避免对象之间的竞争和冲突。
  5. 当系统需要引入新的对象或修改现有对象时,通过中介者模式可以更方便地对系统进行扩展和维护。
  6. 当系统中的对象之间存在复杂的交互关系,并且这些关系需要动态调整时,可以使用中介者模式来管理和调整对象之间的交互行为。

代码示例     

中介者模式是一种行为型设计模式,用于解耦多个对象之间的交互关系。中介者模式通过引入一个中介者对象,将对象之间的交互集中处理,从而减少对象之间的直接耦合。

// 定义中介者接口
public interface Mediator {void sendMessage(User user, String message);
}// 实现中介者接口
public class ConcreteMediator implements Mediator {private User user1;private User user2;public void setUser1(User user1) {this.user1 = user1;}public void setUser2(User user2) {this.user2 = user2;}@Overridepublic void sendMessage(User user, String message) {if (user == user1) {user2.receiveMessage(message);} else if (user == user2) {user1.receiveMessage(message);}}
}// 定义用户类
public abstract class User {protected Mediator mediator;public User(Mediator mediator) {this.mediator = mediator;}public abstract void sendMessage(String message);public abstract void receiveMessage(String message);
}// 实现用户类
public class ConcreteUser1 extends User {public ConcreteUser1(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println("User1 received message: " + message);}
}// 实现用户类
public class ConcreteUser2 extends User {public ConcreteUser2(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println("User2 received message: " + message);}
}// 在客户端使用中介者模式
public class Client {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();User user1 = new ConcreteUser1(mediator);User user2 = new ConcreteUser2(mediator);((ConcreteMediator) mediator).setUser1(user1);((ConcreteMediator) mediator).setUser2(user2);user1.sendMessage("Hello, User2!");user2.sendMessage("Hi, User1!");}
}

在上述代码中,定义了一个Mediator接口作为中介者的抽象,ConcreteMediator实现了这个接口。User是用户的抽象,ConcreteUser1ConcreteUser2User的具体实现。

在客户端的main方法中,创建了一个中介者对象mediator,以及两个用户对象user1user2。通过调用ConcreteMediatorsetUser1setUser2方法,将用户对象和中介者对象关联起来。

两个用户对象通过调用中介者的sendMessage方法来发送消息,中介者根据发送消息的用户不同,将消息发送给对应的用户对象。用户对象收到消息后,通过receiveMessage方法处理收到的消息。

运行上述代码,输出结果如下:

User2 received message: Hello, User2!
User1 received message: Hi, User1!

总结

     

中介者模式是一种行为型设计模式,用于减少对象之间的直接耦合度并促进对象之间的松耦合关系。在中介者模式中,一个中介者对象封装了一组对象之间的交互,并负责协调它们之间的通信。通过将对象之间的直接通信转移到中介者对象中,可以使对象之间的关系更加灵活和可扩展。

中介者模式的核心思想是将对象之间的通信集中到一个中介者对象中,而不是让每个对象直接与其他对象通信。这样一来,当一个对象需要与其他对象进行通信时,它只需要与中介者对象进行通信,而不需要知道其他对象的存在。这种减少了对象之间的直接依赖关系,使系统更加灵活和可维护。

中介者模式有以下几个角色:

  1. 中介者(Mediator):负责定义对象之间的通信接口,并协调它们之间的通信。中介者对象通常会持有一组对象的引用,并在接收到一个对象的通知后,将该信息传递给其他相关的对象。
  2. 同事对象(Colleague):表示系统中的一个具体对象。每个同事对象都知道它的中介者对象,并通过该对象与其他同事对象进行通信。

中介者模式的优点包括:

  1. 减少对象之间的直接耦合度,使系统更加灵活和可扩展。
  2. 简化了对象之间的通信,通过将通信集中到中介者对象中,可以简化对象之间的关系,提高系统的可维护性。
  3. 可以更灵活地添加新的同事对象,因为它们只需要与中介者对象进行通信。

中介者模式的缺点包括:

  1. 中介者对象的复杂性可能会增加,因为它需要处理多个对象之间的通信。
  2. 中介者对象可能成为系统中的单点故障,因为所有对象的通信都依赖于它。

适用场景:

  1. 当对象之间的通信复杂并且难以维护时,可以考虑使用中介者模式来简化通信。
  2. 当一个对象需要与多个其他对象进行通信时,可以使用中介者模式来集中管理这些通信。
  3. 当需要在不修改对象之间的直接通信代码的情况下增加新的对象时,可以使用中介者模式

http://www.ppmy.cn/embedded/47128.html

相关文章

qt自适应图片

在 Qt 中,通过重写 paintEvent 方法来添加自适应背景图片的过程如下: 创建一个自定义的 QWidget 子类。重写 paintEvent 方法,在该方法中使用 QPainter 绘制背景图片。使用 QPixmap 加载图片,并调整图片的大小以适应窗口的大小。…

行为性模式-备忘录模式

备忘录模式是什么 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态。之后,通过将对象恢复到之前保存的状态,可…

面试官:MySQL也可以实现分布式锁吗?

首先说结论,可以做,但不推荐做。 我们并不推荐使用数据库实现分布式锁。 如果非要这么做,实现大概有两种。 1、锁住Java的方法,借助insert实现 如何用数据库实现分布式锁呢,简单来说就是创建一张锁表,比…

ABSD方法论:一种有效的软件开发方法

在软件开发领域,有许多不同的方法论可供选择。其中一种备受关注的方法论是ABSD(Abstract-Based Software Development),即基于抽象的软件开发。本文将介绍ABSD方法论的基本概念以及如何在实际项目中应用这种方法论。 ABSD方法论的…

【动态规划】| 路径问题之不同路径 力扣62

🎗️ 主页:小夜时雨 🎗️ 专栏:动态规划 🎗️ 如何活着,是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

git -- 清除本地分支以及删除远程分支

清除本地分支 1. 列出所有分支:你可以列出所有分支来确认你想要删除的分支名。 git branch -a 2. 删除本地分支: 删除已经合并的分支:git branch -d 分支名 -d 参数用于删除已经被合并到当前分支的分支。 强制删除未合并的分支:git branch -D 分支名 -D 参数用于强制删除…

微服务开发与实战Day02 - Docker

一、Docker快速入门 快速构建、运行、管理应用的工具 安装部署教程:Docs 1. 部署MySQL 测试连接: 镜像和容器 当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身&#xff…

C++ PDF转图片

C PDF转图片#include "include/fpdfview.h" #include <fstream> #include <include/core/SkImage.h>sk_sp<SkImage> pdfToImg(sk_sp<SkData> pdfData) {sk_sp<SkImage> img;FPDF_InitLibrary(nullptr);FPDF_DOCUMENT doc;FPDF_PAGE …