设计模式:中介者模式

中介者模式定义

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个第三方对象(中介者)来管理一组对象之间的复杂交互。这些对象通过中介者而不是直接相互通信,从而减少了它们之间的耦合度,使得代码易于维护和扩展。

应用场景

  • 当多个对象之间的交互形成了网状结构,每个对象都需要了解其他对象,导致系统难以理解和维护时。
  • 当对象间的交互需要被封装在一起,从而独立于这些对象的交互,使得调整和管理交互更加容易时。
  • 当一个系统中对象之间的交互行为是可变的,但又不希望在对象间建立太多的连接时。

示例代码

假设我们有一个简单的聊天室应用,用户可以发送消息给聊天室中的其他用户。在这个例子中,聊天室充当中介者的角色。

中介者接口及其实现

java 复制代码
// 中介者接口
interface ChatMediator {
    void sendMessage(String msg, User user);
    void addUser(User user);
}

// 聊天室实现
class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom() {
        this.users = new ArrayList<>();
    }

    @Override
    public void sendMessage(String msg, User user) {
        for (User u : users) {
            // 消息不应该被发送者接收
            if (u != user) {
                u.receive(msg);
            }
        }
    }

    @Override
    public void addUser(User user) {
        this.users.add(user);
    }
}

用户类

java 复制代码
abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator med, String name) {
        this.mediator = med;
        this.name = name;
    }

    public abstract void send(String msg);
    public abstract void receive(String msg);
}

class ConcreteUser extends User {
    public ConcreteUser(ChatMediator med, String name) {
        super(med, name);
    }

    @Override
    public void send(String msg) {
        System.out.println(this.name + ": Sending Message=" + msg);
        mediator.sendMessage(msg, this);
    }

    @Override
    public void receive(String msg) {
        System.out.println(this.name + ": Received Message:" + msg);
    }
}

客户端代码

java 复制代码
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatRoom();
        User user1 = new ConcreteUser(mediator, "John");
        User user2 = new ConcreteUser(mediator, "Doe");
        User user3 = new ConcreteUser(mediator, "Smith");
        User user4 = new ConcreteUser(mediator, "Alice");
        mediator.addUser(user1);
        mediator.addUser(user2);
        mediator.addUser(user3);
        mediator.addUser(user4);

        user1.send("Hi All");
    }
}

原则间的权衡与冲突

  • 开闭原则:中介者模式提高了系统的可扩展性。新增加的交互可以通过修改中介者或增加新的中介者来实现,而无需修改原有的对象。
  • 单一职责原则:中介者承担了协调各个对象间交互的职责,从而使得对象本身不需要直接交互,符合单一职责原则。

设计模式的局限性

  • 中介者模式可能会导致中介者对象本身变得过于复杂,集中了太多的交互逻辑,难以维护。
  • 过度使用中介者模式可能会导致系统中的部分逻辑变得难以追踪和理解,特别是当中介者负责的交互非常多时。

总结与建议

中介者模式是一种有效的方式来减少类之间的直接交互,降低系统的耦合度。它特别适合用于管理复杂的交互和通信。在使用中介者模式时,应该注意不要让中介者类变得过于庞大和复杂。合理地划分中介者的职责,并在必要时拆分中介者,可以帮助维护中介者模式的清晰性和可维护性。

相关推荐
Mos_x24 分钟前
15.<Spring Boot 日志>
java·后端
mm-q291522272927 分钟前
Java并发编程从入门到进阶 多场景实战
java·开发语言
Violet_YSWY34 分钟前
任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存【示例】
java·数据结构
SimonKing41 分钟前
你的项目还在用MyBatis吗?或许这个框架更适合你:Easy-Query
java·后端·程序员
nice_lcj52042 分钟前
认识多线程:单例模式
java·开发语言·单例模式
货拉拉技术44 分钟前
从代码到配置:如何用SQL配置实现数据核对
java·后端
程序员小假1 小时前
设计模式了解吗,知道什么是饿汉式和懒汉式吗?
java·后端
拾忆,想起1 小时前
TCP粘包拆包全解析:数据流中的“藕断丝连”与“一刀两断”
java·网络·数据库·网络协议·tcp/ip·哈希算法
后端小张1 小时前
【JAVA 进阶】穿越之我在修仙世界学习 @Async 注解(深度解析)
java·开发语言·spring boot·后端·spring·注解·原理
不要额外加糖1 小时前
tql,寥寥几行,实现无队列无感刷新
前端·javascript·设计模式