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


相关文章
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
2天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
6天前
|
设计模式 安全 算法
【Java面试题汇总】设计模式篇(2023版)
谈谈你对设计模式的理解、七大原则、单例模式、工厂模式、代理模式、模板模式、观察者模式、JDK中用到的设计模式、Spring中用到的设计模式
【Java面试题汇总】设计模式篇(2023版)
|
6天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
21天前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
37 2
|
21天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
30 1
|
21天前
|
设计模式 Java
重构你的代码:探索Java中的混合、装饰器与组合设计模式
【8月更文挑战第30天】在软件开发中,设计模式为特定问题提供了结构化的解决方案,使代码更易理解、维护及扩展。本文将介绍三种常用的 Java 设计模式:混合模式、装饰器模式与组合模式,并附有示例代码展示实际应用。混合模式允许通过继承多个接口或抽象类实现多重继承;装饰器模式可在不改变对象结构的情况下动态添加新功能;组合模式则通过树形结构表示部分-整体层次,确保客户端处理单个对象与组合对象时具有一致性。
15 1
|
6天前
|
设计模式 算法 安全
设计模式——模板模式
模板方法模式、钩子方法、Spring源码AbstractApplicationContext类用到的模板方法
设计模式——模板模式
|
1月前
|
设计模式
设计模式-单一职责模式
设计模式-单一职责模式
|
1月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)