【设计模式】用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() 方法发送消息,中介者会负责将消息转发给其他用户。


相关文章
|
11天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
27 0
[Java]23种设计模式
|
27天前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
2月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
27天前
|
设计模式 Java
Java设计模式
Java设计模式
25 0
|
30天前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
26 0
|
30天前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
40 0
|
30天前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
39 0
|
4天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
6天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###