一.中介者模式介绍与使用场景

中介者模式(Mediator Pattern)是一种行为设计模式,它通过封装一系列对象之间的交互,将对象之间的通信集中处理,从而降低对象之间的耦合度。

中介者模式的核心是中介者(Mediator)角色,它定义了对象之间的通信接口,负责协调和控制对象之间的交互。具体的对象称为同事(Colleague)角色,每个同事角色都与中介者进行通信,而不直接与其他同事进行交互。

中介者模式的应用场景:

  1. 当系统中的对象之间存在复杂的相互关系和依赖关系,导致对象之间的通信和协作变得混乱难以维护时,可以考虑使用中介者模式。中介者模式将对象之间的通信集中在一个中介者对象中,简化了对象之间的交互,减少了耦合度。

  2. 当系统中的对象之间需要进行频繁的通信和协作,而且每个对象都需要知道其他对象的信息时,可以使用中介者模式。中介者模式可以避免对象之间相互引用,降低了对象之间的直接依赖关系,提高了系统的灵活性和可维护性。

  3. 当系统中的对象之间存在复杂的交互逻辑和业务流程,而且这些逻辑分散在多个对象中时,可以使用中介者模式。中介者模式可以将复杂的交互逻辑封装在中介者中,使得对象之间的交互更加简洁和可控。

  4. 当系统中的某个对象的行为依赖于其他多个对象的状态变化时,可以使用中介者模式。中介者可以监控对象的状态变化,并根据需要进行协调和调度,确保对象之间的一致性和正确性。

  5. 当系统需要扩展新的对象或者修改现有对象时,可以考虑使用中介者模式。中介者模式可以减少新对象和现有对象之间的直接依赖关系,降低修改的复杂性,提高系统的可扩展性。

需要注意的是,中介者模式在一定程度上引入了中介者对象作为中心化的调度者,可能会增加系统的复杂性。因此,需要根据具体的应用场景和需求来判断是否使用中介者模式。

二.中介者模式实现

下面是一个使用Java实现的简单示例:

首先,我们定义中介者接口 Mediator

public interface Mediator {
    void send(String message, Colleague colleague);
}

然后,我们创建具体中介者类 ConcreteMediator,实现中介者接口,并管理同事对象之间的交互:

public class ConcreteMediator implements Mediator {
    private Colleague colleague1;
    private Colleague colleague2;
    
    public void setColleague1(Colleague colleague1) {
        this.colleague1 = colleague1;
    }
    
    public void setColleague2(Colleague colleague2) {
        this.colleague2 = colleague2;
    }
    
    public void send(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receive(message);
        } else if (colleague == colleague2) {
            colleague1.receive(message);
        }
    }
}

 接下来,我们创建同事接口 Colleague

public interface Colleague {
    void receive(String message);
    void send(String message);
}

然后,我们创建具体同事类 ConcreteColleague,实现同事接口,并在需要发送消息时通知中介者:

public class ConcreteColleague implements Colleague {
    private Mediator mediator;
    
    public ConcreteColleague(Mediator mediator) {
        this.mediator = mediator;
    }
    
    public void receive(String message) {
        System.out.println("Received: " + message);
    }
    
    public void send(String message) {
        mediator.send(message, this);
    }
}

最后,我们可以在客户端中使用中介者模式:

public class Client {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        
        ConcreteColleague colleague1 = new ConcreteColleague(mediator);
        ConcreteColleague colleague2 = new ConcreteColleague(mediator);
        
        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);
        
        colleague1.send("Hello, colleague2!");
        colleague2.send("Hi, colleague1!");
    }
}

在上面的示例中,我们创建了一个具体中介者对象 mediator,以及两个具体同事对象 colleague1colleague2。然后,通过调用中介者的 setColleague1()setColleague2() 方法将同事对象注册到中介者中。最后,同事对象可以通过调用自己的 send() 方法发送消息,中介者会负责将消息转发给其他同事。

下面再来举一个实际项目开发中的应用场景例子

假设我们正在开发一个聊天室系统,其中有多个用户同时在线,并且用户之间可以发送消息。我们希望使用中介者模式来管理用户之间的消息传递。

首先,我们定义中介者接口 ChatMediator

public interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

然后,我们创建具体中介者类 ChatRoom,实现中介者接口,并管理用户对象之间的消息传递:

import java.util.ArrayList;
import java.util.List;

public class ChatRoom implements ChatMediator {
    private List<User> users;
    
    public ChatRoom() {
        users = new ArrayList<>();
    }
    
    public void sendMessage(String message, User user) {
        for (User u : users) {
            if (u != user) {
                u.receiveMessage(message);
            }
        }
    }
    
    public void addUser(User user) {
        users.add(user);
    }
}

接下来,我们创建用户类 User,实现用户的行为和消息的接收:

public class User {
    private String name;
    private ChatMediator chatMediator;
    
    public User(String name, ChatMediator chatMediator) {
        this.name = name;
        this.chatMediator = chatMediator;
    }
    
    public void sendMessage(String message) {
        chatMediator.sendMessage(message, this);
    }
    
    public void receiveMessage(String message) {
        System.out.println(name + " received message: " + message);
    }
}

最后,我们可以在客户端中使用中介者模式:

public class Client {
    public static void main(String[] args) {
        ChatMediator chatMediator = new ChatRoom();
        
        User user1 = new User("User1", chatMediator);
        User user2 = new User("User2", chatMediator);
        User user3 = new User("User3", chatMediator);
        
        chatMediator.addUser(user1);
        chatMediator.addUser(user2);
        chatMediator.addUser(user3);
        
        user1.sendMessage("Hello, everyone!");
        user2.sendMessage("Hi, User1!");
    }
}

在上面的示例中,我们创建了一个具体中介者对象 chatMediator,以及多个用户对象 user1user2user3。然后,通过调用中介者的 addUser() 方法将用户对象注册到中介者中。最后,用户对象可以通过调用自己的 sendMessage() 方法发送消息,中介者会负责将消息转发给其他用户。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐