当前位置: 首页 > news >正文

23种设计模式之中介者模式

目录

  • 1. 简介
  • 2. 代码
    • 2.1 Mediator (中介者接口)
    • 2.2 ChatRoom (具体中介者类)
    • 2.3 User (同事接口)
    • 2.4 ChatUser (具体同事类)
    • 2.5 Test (测试)
    • 2.6 运行结果
  • 3. 使用场景
  • 4. 优缺点
  • 5. 总结

1. 简介

中介者模式(Mediator Pattern) 是一种行为设计模式,它通过定义一个中介对象来封装一系列对象之间的交互。中介者使各对象之间不需要显式地相互引用,从而使它们之间的耦合松散,并且可以独立地改变它们之间的交互。
例如,在一个聊天软件系统中,多个用户(同事、朋友等)之间的聊天消息传递可以通过一个服务器(中介者)来进行。用户不需要直接知道其他用户的联系方式或者网络地址等信息,只需要将消息发送给服务器,服务器再将消息转发给指定的其他用户。

结构:

  • 中介者(Mediator)接口
    这是所有具体中介者类都要实现的接口,它定义了用于协调各同事对象(Colleague)之间交互的方法。
  • 具体中介者(Concrete Mediator)类
    具体中介者类实现了中介者接口,它包含了对多个同事对象的引用,并通过这些引用协调同事对象之间的交互。在聊天软件中,服务器类就是具体中介者类,它维护了在线用户列表,并负责将消息从一个用户转发给另一个用户。
  • 同事(Colleague)接口
    同事接口定义了同事对象与中介者进行交互的方法。在聊天软件中,这个接口可以包含发送消息和接收消息的方法。
  • 具体同事(Concrete Colleague)类
    具体同事类实现了同事接口,它持有一个中介者对象的引用,通过这个引用与其他同事进行间接的交互。在聊天软件中,用户客户端类就是具体同事类,它在发送消息时将消息发送给服务器(中介者),接收消息时也是从服务器获取消息。

2. 代码

2.1 Mediator (中介者接口)

public interface Mediator {void work(User user, String message);
}

2.2 ChatRoom (具体中介者类)

import java.util.ArrayList;
import java.util.List;public class ChatRoom implements Mediator{private List<User> users = new ArrayList<>();@Overridepublic void work(User user, String message) {for (User otherUser : users) {if (otherUser!= user) {otherUser.receiveMessage(message);}}}public void addUser(User user) {users.add(user);}
}

2.3 User (同事接口)

public interface User {void sendMessage(String message);void receiveMessage(String message);
}

2.4 ChatUser (具体同事类)

public class ChatUser implements User{private Mediator mediator;private String name;public ChatUser(Mediator mediator, String name) {this.mediator = mediator;this.name = name;}@Overridepublic void sendMessage(String message) {mediator.work(this,message);}@Overridepublic void receiveMessage(String message) {System.out.println(name + " received message: " + message);}
}

2.5 Test (测试)

public class Test {public static void main(String[] args) {ChatRoom mediator = new ChatRoom();User robert = new ChatUser(mediator,"Robert");User john = new ChatUser(mediator,"John");mediator.addUser(robert);mediator.addUser(john);robert.sendMessage("Hi John!");john.sendMessage("Hello Robert!");}
}

2.6 运行结果

John received message: Hi John!
Robert received message: Hello Robert!

3. 使用场景

  1. 复杂交互关系:当系统中存在多个对象之间复杂的依赖关系时,中介者模式可以简化这些关系,使系统更加清晰易维护。例如,在一个聊天室应用中,用户通过中介者(如聊天室)进行消息传递,而不是直接与其他用户建立连接,这样可以降低直接依赖,增加系统的灵活性。
  2. 减少子类生成:在需要处理大量子类的情况下,中介者模式可以集中处理对象间的交互逻辑,避免直接耦合,从而减少子类的数量。
  3. 强耦合问题:中介者模式能够降低对象间的强耦合,提高系统的灵活性。例如,在一个电子商务平台中,买家、卖家和订单管理系统之间可以通过中介者进行协调,从而简化复杂的交互逻辑。
  4. 多对象共享中介者:当多个对象需要共享同一个中介者时,中介者负责协调这些对象之间的通信。例如,在分布式系统中,中介者可以充当调度中心,协调不同节点的工作。
  5. GUI系统:在图形用户界面(GUI)系统中,中介者模式可以用来管理各个控件之间的交互。例如,当用户点击某个按钮时,中介者对象负责将这个事件通知给相关的控件,从而触发相应的操作。
  6. 事件处理系统:在事件处理系统中,中介者对象可以负责协调事件的发布和订阅,确保事件能及时传递给感兴趣的对象。
  7. 多线程系统:在多线程系统中,中介者模式可以用来协调不同线程之间的交互。例如,当某个线程需要与另一个线程通信时,它只需要通过中介者对象来发送消息,而不需要直接与另一个线程建立连接。
  8. 分布式系统:在分布式系统中,中介者模式可以用来协调不同组件之间的通信。例如,某个组件需要与另一个组件通信时,它只需要通过中介者对象来发送消息,而不需要直接与另一个组件建立连接。
  9. MVC架构:在MVC架构中,控制器(Controller)充当模型(Model)和视图(View)之间的中介者,从而降低对象之间的耦合性。

中介者模式的优点包括降低耦合度、提高系统的可维护性和可扩展性。然而,过度使用可能导致中介者对象过于复杂,难以维护和管理。因此,在实际应用中需要谨慎选择其使用时机,并合理划分中介者的职责。

4. 优缺点

  • 优点:

    1. 降低耦合度:中介者模式通过将多个对象的交互封装在中介者中,使得各个对象不再直接相互引用,从而减少了对象间的依赖关系。这种解耦合的设计使得对象可以独立变化和复用,提高了代码的可维护性和灵活性。
    2. 集中控制:所有的交互逻辑都由中介者集中管理,这使得系统的行为更加清晰,代码维护更为集中。因此,当需要修改系统行为时,只需修改中介者即可,而无需修改其他对象。
    3. 提高可扩展性:中介者模式允许在不改变现有对象的情况下添加新的对象或行为,只需修改中介者即可实现扩展。这使得系统更容易添加或删除对象,而无需影响其他对象。
    4. 简化对象交互:中介者模式将复杂的交互逻辑集中在中介者中,使得对象之间的交互变得简单和集中。这有助于简化系统结构,降低系统的复杂度。
    5. 增强对象的封装性:同事对象只需与中介者通信,不必知道其他同事的存在,从而增强了对象的封装性。
  • 缺点:

    1. 中介者复杂性:随着系统中对象数量的增加,中介者需要处理的逻辑变得复杂,可能导致中介者自身变得难以维护。具体中介者类可能会变得庞大且复杂,难以管理和维护。
    2. 性能开销:中介者模式引入了一个额外的中介者对象,这可能会增加系统的性能开销。在通信期间需要额外的调度,可能会影响性能。
    3. 单点故障:中介者模式引入了一个中心化的中介者对象,如果这个中介者出现问题,可能会影响整个系统的功能。这增加了系统的脆弱性。
    4. 过度依赖中介者:如果设计不当,中介者可能成为系统中的“上帝对象”,承担过多的职责,导致系统难以维护。
    5. 不适用简单场景:在对象之间的交互相对简单的情况下,使用中介者模式可能会引入不必要的复杂性,增加代码的复杂度。
    6. 违背开闭原则:当新的同事对象被加入时,可能需要修改中介者对象的代码,这违反了开闭原则。

中介者模式在处理复杂的对象交互场景中具有显著的优势,但在简单场景下可能会显得过于繁琐。因此,在使用中介者模式时,需要根据具体情况权衡其优缺点,确保模式的使用能够带来实际的设计和维护好处。

5. 总结

在实际应用中,中介者模式可以用于管理复杂的系统结构,如聊天室、游戏开发中的角色和事件管理等。例如,在一个聊天系统中,每个用户通过中介者对象发送和接收消息,而不是直接与其他用户通信,从而简化了系统的交互逻辑。

中介者模式通过引入一个中介者对象来封装对象间的交互逻辑,使得系统结构更加松散耦合和易于维护。然而,在使用该模式时需要谨慎处理中介者的职责分配,以确保系统的稳定性和可维护性。

http://www.lryc.cn/news/502021.html

相关文章:

  • 【Golang】Go语言编程思想(六):Channel,第六节,并发编程模式
  • unity打包web,如何减小文件体积,特别是 Build.wasm.gz
  • go引入skywalking
  • 大华DSS数字监控系统 attachment_downloadAtt.action 任意文件下载漏洞复现
  • qt 封装 调用 dll
  • Python使用Selenium库获取 网页节点元素、名称、内容的方法
  • 系统安全——访问控制访问控制
  • SQL Server 数据库还原到某个时点(完整恢复模式)
  • 埃隆马斯克X-AI发布Grok-2大模型,快来体验~
  • Python工厂设计模式:简化对象创建
  • 【隐私计算篇】隐私集合求交(PSI)原理深入浅出
  • 工作中常用的8种设计模式
  • Qwen 论文阅读记录
  • 自动驾驶:百年演进
  • SSM 校园一卡通密钥管理系统 PF 于校园图书借阅管理的安全保障
  • 什么叫中间件服务器?
  • 【docker】12. Docker Volume(存储卷)
  • SpringBoot【八】mybatis-plus条件构造器使用手册!
  • OpenAI直播发布第4天:ChatGPT Canvas全面升级,免费开放!
  • 自学高考的挑战与应对:心理调适、学习方法改进与考试技巧提升
  • 2024年12月11日Github流行趋势
  • Next.js配置教程:构建自定义服务器
  • SpringCloud 题库
  • 基于Filebeat打造高效日志收集流水线
  • 《HTML 的变革之路:从过去到未来》
  • 快速了解 Aurora DSQL
  • 计算机视觉与医学的结合:推动医学领域研究的新机遇
  • Scala的隐式对象
  • PageHelper自定义Count查询及其优化
  • 【数据结构】哈夫曼树