📜  中介者设计模式(1)

📅  最后修改于: 2023-12-03 15:06:15.078000             🧑  作者: Mango

中介者设计模式

中介者设计模式是一种行为型设计模式,可以降低对象之间的耦合度。它通过引入一个中介者对象来协调其他对象之间的交互,从而避免它们之间的直接依赖关系。以下是该模式的组成部分:

组成部分
Mediator(中介者)

中介者是最核心的部分。它定义了一组接口,用于与 Colleague(同事)对象进行通信,并负责协调它们之间的交互。因为只有中介者与其他对象进行通信,所以它能够维护对象之间的松散耦合。中介者可以是抽象类或接口,它的具体实现可以是单体模式或访问者模式。

ConcreteMediator(具体中介者)

具体中介者是 Mediator 的实现。它了解并维护 Colleague 对象之间的依赖关系,并协调它们之间的通信。具体中介者通常会存储其他对象的引用,以便相互通信。ConcreteMediator 也可以实现 Mediator 的接口,以使它能够被其他对象识别。

Colleague(同事)

同事是需要协作的对象。每个同事对象都知道中介者对象,并使用其接口来与其他同事对象通信。每个同事对象通常只知道自己的行为,而不关心其他同事对象的行为。同事对象之间的直接通信被中介者对象拦截并处理。

ConcreteColleague(具体同事)

具体同事是 Colleague 的实现。它了解并维护自己的状态,并实现与其他同事对象的交互。它们需要向中介者对象注册自己,并使用中介者的接口来与其他同事对象通信。

代码实现

下面是一个简单的代码示例,描述了一个聊天室中的用户如何通过中介者对象进行通信。

Mediator
public interface ChatRoomMediator {
    void showMessage(User user, String message);
}
ConcreteMediator
public class ChatRoom implements ChatRoomMediator {
    @Override
    public void showMessage(User user, String message) {
        System.out.println(new Date().toString()
            + " [" + user.getName() + "] : " + message);
    }
}
Colleague
public abstract class User {
    protected String name;
    protected ChatRoomMediator chatMediator;

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

    public abstract void sendMessage(String message);

    public String getName() {
        return name;
    }
}
ConcreteColleague
public class ChatUser extends User {
    public ChatUser(ChatRoomMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void sendMessage(String message) {
        chatMediator.showMessage(this, message);
    }
}
使用示例
public class ChatRoomDemo {
    public static void main(String[] args) {
        ChatRoomMediator chatRoom = new ChatRoom();
        User user1 = new ChatUser(chatRoom, "User1");
        User user2 = new ChatUser(chatRoom, "User2");
        User user3 = new ChatUser(chatRoom, "User3");

        user1.sendMessage("Hello, I am User1.");

        user2.sendMessage("Hi User1, I am User2.");

        user3.sendMessage("Hi all, I am User3.");
    }
}
优点
  1. 可以降低对象之间的耦合度,使得它们可以独立修改和扩展。
  2. 简化了对象之间的交互,使得系统更易于维护和理解。
  3. 通过集中控制交互行为,可以方便地进行封装和测试。
缺点
  1. 可能会引入新的单点故障,因为所有对象之间的通信都必须通过中介者对象进行处理。
  2. 如果介质者对象变得过于复杂,可能会变得难以维护和理解。
适用场景
  1. 当一组对象之间的交互比较复杂,而且它们之间没有明显的依赖关系时,可以使用中介者模式来管理它们之间的通信。
  2. 当一个对象的行为取决于其他对象的状态时,可以使用中介者模式来避免相互引用和混乱的关系链。