找回密码
 立即注册
首页 业界区 业界 中介者模式

中介者模式

翁谌缜 2025-6-6 14:48:40
​中介者(Mediator)模式属于行为型模式的一种。中介者模式的目的是把多方会谈变成双方会谈,从而实现多方的松耦合。用一个中介对象来封装一系列的对象交互。这样,系统中的各个对象不直接互相引用,而是通过中介者进行交互,从而降低了系统的耦合度。
MVC模式以及MVVM模式都可以看作是中介者模式的扩展。中介者模式能减少对象之间混乱无序的依赖关系。类所拥有的依赖关系越少,就越易于修改、 扩展或复用。
在真实世界中,飞机驾驶员不会直接相互沟通来决定哪一架飞机先降落,而是通过塔台来进行沟通,此时的塔台就是一个中介者对象。
当多个类之间存在复杂的交互,而这些交互又不希望在各个类之间直接进行时;当系统中的对象之间需要有统一的协调,但不想让这些对象直接依赖彼此时,都可以使用中介者模式。
中介者模式通常有以下组成部分: 

  • Mediator(中介者接口):定义了一个接口,用于与多个同事对象进行交互。
  • ConcreteMediator(具体中介者):实现中介者接口,协调和管理多个同事对象的交互。
  • Colleague(同事类):所有同事类都知道中介者对象,它们通过中介者与其他同事类进行交互。
  • ConcreteColleague(具体同事类):每个具体同事类都向中介者发出请求并接收来自中介者的通知。
我们模拟一个简单的聊天室应用。聊天室相当于一个中介者。
1、Mediator: 中介者接口
  1. // Mediator: 中介者接口
  2. interface ChatRoom {
  3.     void sendMessage(String message, User user);
  4. }
复制代码
1.gif
2、ConcreteMediator: 具体中介者
  1. // ConcreteMediator: 具体中介者
  2. class ConcreteChatRoom implements ChatRoom {
  3.     @Override
  4.     public void sendMessage(String message, User user) {
  5.         System.out.println(user.getName() + " sends message: " + message);
  6.         // 中介者通知所有其他用户
  7.         for (User u : users) {
  8.             if (u != user) {
  9.                 u.receiveMessage(message);
  10.             }
  11.         }
  12.     }
  13.     private List<User> users = new ArrayList<>();
  14.    
  15.     // 注册用户
  16.     public void addUser(User user) {
  17.         users.add(user);
  18.     }
  19. }
复制代码
2.gif
3、Colleague: 同事类
  1. // Colleague: 同事类
  2. abstract class User {
  3.     protected ChatRoom chatRoom;
  4.     protected String name;
  5.     public User(ChatRoom chatRoom, String name) {
  6.         this.chatRoom = chatRoom;
  7.         this.name = name;
  8.     }
  9.     public String getName() {
  10.         return name;
  11.     }
  12.     public abstract void sendMessage(String message);
  13.     public abstract void receiveMessage(String message);
  14. }
复制代码
3.gif
4、ConcreteColleague: 具体同事类
  1. // ConcreteColleague: 具体同事类
  2. class ConcreteUser extends User {
  3.     public ConcreteUser(ChatRoom chatRoom, String name) {
  4.         super(chatRoom, name);
  5.     }
  6.     @Override
  7.     public void sendMessage(String message) {
  8.         chatRoom.sendMessage(message, this);
  9.     }
  10.     @Override
  11.     public void receiveMessage(String message) {
  12.         System.out.println(name + " received: " + message);
  13.     }
  14. }
复制代码
4.gif
5、客户端
  1. // 客户端代码
  2. public class MediatorPatternDemo {
  3.     public static void main(String[] args) {
  4.         ConcreteChatRoom chatRoom = new ConcreteChatRoom();
  5.         User user1 = new ConcreteUser(chatRoom, "Alice");
  6.         User user2 = new ConcreteUser(chatRoom, "Bob");
  7.         User user3 = new ConcreteUser(chatRoom, "Charlie");
  8.         chatRoom.addUser(user1);
  9.         chatRoom.addUser(user2);
  10.         chatRoom.addUser(user3);
  11.         user1.sendMessage("Hi everyone!");
  12.         user2.sendMessage("Hello Alice!");
  13.     }
  14. }
复制代码
5.gif
中介者模式的优缺点。
优点:

  • 降低耦合度:通过将对象的交互逻辑集中到中介者中,减少了对象之间的直接依赖。
  • 易于扩展:如果需要添加新的同事类,只需让其继承User类并实现相关功能,而不需要修改其他对象的代码。
  • 集中控制:所有交互逻辑都集中在中介者类中,便于管理和控制复杂的交互流程。
缺点:

  • 中介者过于复杂:当系统中的对象过多时,中介者可能会变得非常复杂,甚至成为“上帝对象”。
  • 不适用所有场景:对于简单的系统,使用中介者模式可能会过度设计,反而增加了不必要的复杂性。
坚持往前走,不回头、不放弃,冰封万里也能走到春暖花开。-- 烟沙九洲
 ◀
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册