设计模式(22/23) - 中介者模式

48 阅读3分钟

中介者模式

1 概述

  • 中介者模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介者对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而使它们可以松散耦合。中介者模式通过引入中介者对象,简化对象之间的通信,减少类之间的依赖关系,提升系统的可维护性和扩展性。
  • 中介者模式定义了一个中介者接口,由具体的中介者类实现具体的协调工作。各个对象通过中介者进行通信,而不需要相互引用。

2 优缺点及应用场景

2.1 优点

  • 1)降低耦合度:对象之间的通信通过中介者进行,从而减少了对象之间的直接依赖。
  • 2)集中控制:中介者集中管理对象之间的交互,使得交互更加清晰和易于管理。
  • 3)提升可维护性和扩展性:新的对象或交互只需修改中介者,符合开闭原则。

2.2 缺点

  • 1)中介者复杂性增加:随着对象数量和交互的增加,中介者可能变得复杂,难以维护。
  • 2)性能问题:由于中介者集中管理对象之间的交互,可能会导致性能瓶颈。

2.3 应用场景

  • 1)MVC 框架:控制器作为模型和视图的中介者。
  • 2)复杂对象之间的通信:对象之间的交互比较复杂且多变的场景。
  • 3)需要解耦对象之间的关系:希望通过引入中介者减少对象之间直接依赖的场景。
  • 4)需要集中管理对象交互:希望通过中介者集中管理和控制对象之间的交互行为的场景。

3 结构

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

4 实现

4.1 UML 类图

中介者模式.jpg

4.2 代码示例

// 创建中介类
class ChatRoom {
  public static void showMessage(User user, String message) {
    System.out.println(new Date().toString() + " [" + user.getName() + "] : " + message);
  }
}

// 创建 user 类
class User {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public User(String name) {
    this.name = name;
  }

  public void sendMessage(String message) {
    ChatRoom.showMessage(this, message);
  }
}

// 使用示例
public class MediatorPatternDemo {
  public static void main(String[] args) {
    // 使用 User 对象来显示他们之间的通信
    User robert = new User("Robert");
    User john = new User("John");

    robert.sendMessage("Hi! John!");
    john.sendMessage("Hello! Robert!");
  }
}
  • 执行程序,输出结果:
Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!

5 总结

  • 中介者模式通过一个中介者对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而使它们可以松散耦合。中介者模式适用于复杂对象之间的通信、需要解耦对象之间的关系以及需要集中管理对象交互的场景。尽管中介者模式降低了对象之间的耦合度,并简化了对象之间的通信,但也可能导致中介者复杂性增加和性能问题。在实际应用中,需要根据具体需求合理使用中介者模式,以实现灵活可扩展的系统设计。