设计模式之 中介者模式

news/2024/11/28 23:55:54/

中介者模式(Mediator Pattern)是一种行为型设计模式,旨在通过引入一个中介者对象来降低多个对象之间的耦合度,从而促进对象间的通信和协调。中介者模式的核心思想是“将对象之间的直接交互移到一个中介者对象中”,让中介者负责处理各个对象间的交互逻辑,而不是让对象直接相互调用。这样,参与者(对象)只与中介者对象通信,而不需要了解其他参与者的存在,从而降低了系统的复杂性。

一、中介者模式的结构

中介者模式通常由以下几个角色组成:

  1. Mediator(中介者接口):定义一个接口,用来声明和管理各个具体同事类的交互。
  2. ConcreteMediator(具体中介者):实现Mediator接口,协调各个同事对象之间的交互。具体中介者了解所有同事对象,并控制它们之间的交互规则。
  3. Colleague(同事类):每一个同事类通常代表系统中的一个组件或模块,它只与中介者进行通信,而不是与其他同事类直接交互。同事类通过中介者来获取其他同事的服务或信息。
  4. ConcreteColleague(具体同事类):实现Colleague接口的具体类,这些类通过中介者与其他同事类进行交互。
二、中介者模式的工作原理

中介者模式中,具体的同事类(Colleague)不直接交互,而是通过中介者(Mediator)来进行交流。所有的交互逻辑都集中在中介者中,其他类之间的耦合度降低。每个同事类只知道如何通过中介者与其他同事类进行交流,而不需要知道具体的通信细节。

例如,假设有多个模块(比如按钮、文本框、标签等),每个模块都需要与其他模块交互。在没有中介者模式时,模块之间会直接相互调用,这样会增加耦合度。如果我们引入一个中介者类,每个模块只与中介者对象交互,而不需要知道其他模块的存在。中介者负责处理模块间的交互。

三、示例代码

以下是一个简单的中介者模式的示例,展示了如何使用中介者模式来管理两个同事类(按钮和文本框)之间的交互:

  • 定义中介者接口
    public interface Mediator {void contact(String message,Person person);
    }
    
  • 定义同事类接口
    public abstract class Person {protected String name;protected Mediator mediator;public Person(String name, Mediator mediator) {this.name = name;this.mediator = mediator;}public abstract void getMessage(String message);public abstract void contact(String message);
    }
    
  • 定义具体的中介者类
    public class MediatorImpl implements Mediator{private Tenant tenant;private HouseOwner houseOwner;public void setTenant(Tenant tenant) {this.tenant = tenant;}public void setHouseOwner(HouseOwner houseOwner) {this.houseOwner = houseOwner;}@Overridepublic void contact(String message, Person person) {if (person == tenant){houseOwner.getMessage(message);}else {tenant.getMessage(message);}}
    }
    
  • 定义具体的同事类
    public class Tenant extends Person{public Tenant(String name, Mediator mediator) {super(name, mediator);}@Overridepublic void getMessage(String message) {System.out.println("租客"+name+"收到消息"+message);}@Overridepublic void contact(String message) {mediator.contact(message, this);}
    }
    
    public class HouseOwner extends Person{public HouseOwner(String name, Mediator mediator) {super(name, mediator);}@Overridepublic void getMessage(String message) {System.out.println("房子主人"+name +"收到消息"+message);}@Overridepublic void contact(String message) {mediator.contact(message, this);}
    }
  • 客户端代码
    public class Client {public static void main(String[] args) {MediatorImpl mediator = new MediatorImpl();Tenant tenant = new Tenant("张三", mediator);HouseOwner houseOwner = new HouseOwner("李四", mediator);mediator.setTenant(tenant);mediator.setHouseOwner(houseOwner);tenant.contact("我要租房子");houseOwner.contact("我有房子");}
    }
  • 输出结果
四、中介者模式的优缺点
优点:
  1. 减少耦合:同事类之间不再直接依赖,相互之间的交互都通过中介者来实现,从而减少了系统中对象之间的依赖关系。
  2. 集中控制:所有的交互逻辑都由中介者集中管理,使得系统的行为更加清晰,代码维护更为集中。
  3. 扩展性好:当需要新增同事类时,只需修改中介者,而无需修改现有的同事类,从而使得系统的扩展更加方便。
缺点:
  1. 中介者复杂度提高:随着同事类的增多,中介者的逻辑也会变得复杂,因为中介者需要处理更多的交互场景,可能导致中介者类过于庞大。
  2. 依赖于中介者:所有同事类依赖于中介者,可能导致中介者成为单一的“瓶颈”对象,降低了灵活性。
  3. 过度使用可能导致代码不清晰:如果使用中介者模式过多,可能导致逻辑分散过度,难以清晰地理解系统的整体流程。
五、应用场景

中介者模式适用于以下几种场景:

  1. 多个类相互交互:当多个对象间存在复杂的交互关系时,使用中介者模式可以简化对象之间的交互,减少耦合。
  2. 需要集中管理的交互逻辑:当多个对象的交互逻辑需要统一管理时,可以将这些交互集中到一个中介者对象中。
  3. 系统中存在复杂的事件处理:例如,GUI界面中多个组件之间的事件处理,使用中介者模式可以将事件处理集中在中介者中,从而使得代码更加清晰。

http://www.ppmy.cn/news/1550757.html

相关文章

AI在线免费视频工具4:AI视频编辑ai-video-composer

1、ai-video-composer 使用自然语言从您的资产组成新的视频。添加视频、图像和音频资源,让 Qwen 2.5-Coder 为您生成一个新的视频(使用 FFMPEG) https://huggingface.co/spaces/huggingface-projects/ai-video-composer

突破Zustand的局限性:与React ContentAPI搭配使用

Zustand在状态管理中是非常适手的工具,在很多场景中我们都可以用它来解决复杂问题. 但是由于Zustand的设计理念,它仍然有一些限制,在这里用官网中的小demo举一个很简单的例子: import { create } from zustand type CountStore …

numpy.digitize函数介绍

numpy.digitize 是 NumPy 中的一个函数,用于根据给定的边界(分箱规则)对输入数组中的值进行分箱,返回对应的箱索引。它在分段处理、统计分布和离散化数据等场景中非常有用。 函数签名 numpy.digitize(x, bins, right=False)参数详解 x: 输入数组,表示需要进行分箱的值。…

PG17 外链设置

很多工具不太支持PG17,看了下要 WINDOS测试链接 查看端口 [sharksharkdb>~]$pg_isready/tmp:5432- accepting connections 查看PG日志 ​​​​​​​ 2024-11-22 05:23:27.361 CST [113921] LOG: invalid authentication method"192.168.2.0/24"2024-11-22 0…

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…

云计算的计算包括哪些内容

‌云计算的计算主要包括以下几种类型‌: ‌分布式计算‌:分布式计算是一种计算方法,它将大型问题分解成多个小任务,然后分配给多个计算机进行处理。这种方法可以提高计算效率和可靠性‌1。‌并行计算‌:并行计算是同时…

map和redis关系

Map 和 Redis 都是用于存储和管理数据的工具,但它们在用途、实现和应用场景上有所不同。下面详细解释 Map 和 Redis 之间的关系和区别。 1. Map 数据结构 定义 Map 是一种数据结构,用于存储键值对(key-value pairs)。每个键都是…

【逐行注释】自适应观测协方差R的AUKF(自适应无迹卡尔曼滤波,MATLAB语言编写),附下载链接

文章目录 自适应R的UKF逐行注释的说明运行结果部分代码各模块解释 自适应R的UKF 自适应无迹卡尔曼滤波(Adaptive Unscented Kalman Filter,AUKF)是一种用于状态估计的滤波算法。它是基于无迹卡尔曼滤波(Unscented Kalman Filter&…