【设计模式】用Java实现中介者模式

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

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


中介者模式(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,以及两个具体同事对象 colleague1 和 colleague2。然后,通过调用中介者的 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,以及多个用户对象 user1、user2 和 user3。然后,通过调用中介者的 addUser() 方法将用户对象注册到中介者中。最后,用户对象可以通过调用自己的 sendMessage() 方法发送消息,中介者会负责将消息转发给其他用户。


相关文章
|
21天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
35 0
[Java]23种设计模式
|
4天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
1月前
|
设计模式 Java
Java设计模式
Java设计模式
28 0
|
1月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
29 0
|
1月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
42 0
|
1月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
40 0
|
5月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
57 4
|
2月前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
40 11
|
3月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)