设计模式之中介者模式

目录

定义

中介者模式‌通过引入中介对象封装多个对象间的交互‌,使对象间无需直接引用,从而降低耦合度。各对象仅与中介者通信,交互逻辑集中管理,符合迪米特法则(最少知识原则)。

结构

适用场景

1)‌复杂网状依赖‌

对象间存在大量直接引用,导致系统混乱(如用户-角色-权限循环依赖)。

2)‌需集中管控的交互‌

GUI组件联动(按钮点击触发输入框禁用)。

3)聊天系统中用户消息广播。

多玩家游戏的角色协作(如战斗指令分发)。

4)‌重构强耦合代码‌

拆分因直接通信导致难以扩展的类。

使用示例

聊天室系统。

复制代码
/**
 * 抽象中介者
 */
public interface ChatMediator {

    void sendMessage(String msg, User sender);

    void addUser(User user);

}

/**
 * 具体中介者(聊天室)
 */
public class ChatRoom implements ChatMediator {

    private List<User> users = new ArrayList<>();

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

    public void sendMessage(String msg, User sender) {
        for (User user : users) {
            if (user != sender) user.receive(msg);  // 屏蔽发送者自身
        }
    }
}

/**
 * 抽象同事类
 */
public abstract class User {

    protected ChatMediator mediator;

    protected String name;

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

    public abstract void send(String msg);

    public abstract void receive(String msg);
}

/**
 * 具体同事类
 */
public class ChatUser extends User {

    public ChatUser(String name, ChatMediator mediator) {
        super(name, mediator);
    }

    public void send(String msg) {
        System.out.println(name + " 发送: " + msg);
        mediator.sendMessage(msg, this);  // 通过中介者转发
    }

    public void receive(String msg) {
        System.out.println(name + " 收到: " + msg);
    }
}

public class Client {

    public static void main(String[] args) {
        ChatMediator chatRoom = new ChatRoom();
        User alice = new ChatUser("Alice", chatRoom);
        User bob = new ChatUser("Bob", chatRoom);
        chatRoom.addUser(alice);
        chatRoom.addUser(bob);
        alice.send("你好,Bob!");
        bob.send("你好,alice!");
    }

}
相关推荐
回家路上绕了弯2 分钟前
Java双亲委派机制:从原理到实践的全面解析
java·后端
努力的小郑3 分钟前
亿级流量下的生死抉择:Apache BeanUtils vs MapStruct性能差距32倍!架构师选型指南
java·spring·apache
努力的小郑4 分钟前
BeanUtils拷贝大对决:Spring与Apache Commons的差异与妙用
java·spring·apache
求知摆渡9 分钟前
Spring Boot 3.5 + Spring Cloud Stream:邮件发送与幂等实战
java·spring boot·spring cloud
用户400784221126011 分钟前
苍穹外卖实现员工账号启用禁用
java
中东大鹅15 分钟前
Mybatis Plus 多数据源
java·数据库·spring boot·后端·mybatis
用户400784221126026 分钟前
苍穹外卖实现员工分页查询
java
Code季风27 分钟前
深入理解令牌桶算法:实现分布式系统高效限流的秘籍
java·算法·微服务
大葱白菜29 分钟前
Java 代理机制详解:从静态代理到动态代理,彻底掌握代理模式的原理与实战
java·后端·程序员
大葱白菜31 分钟前
Java 注解的作用详解:为什么它是 Java 开发中不可或缺的利器?
java·后端·程序员