行为型-中介者模式

1. 项目结构

  1. 项目结构
bash 复制代码
	mediator-pattern-demo/
	├── src/
	│   └── main/
	│       └── java/
	│           └── com/
	│               └── example/
	│                   └── mediator/
	│                       ├── Mediator.java
	│                       ├── ChatMediator.java
	│                       ├── User.java
	│                       ├── ChatUser.java
	│                       └── Main.java
	├── pom.xml
	└── README.md
  1. Maven配置文件 (pom.xml)

    xml 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.example</groupId>
        <artifactId>mediator-pattern-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <!-- 如果需要测试,可以添加JUnit依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13.2</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>

2. 代码实现

  1. 中介者接口 (Mediator.java)

    java 复制代码
    package com.example.mediator;
    
    /**
     * 中介者接口
     * 定义同事对象与中介者交互的方法
     */
    public interface Mediator {
        /**
         * 发送消息
         * @param message 消息内容
         * @param user 发送者
         */
        void sendMessage(String message, User user);
        
        /**
         * 添加用户
         * @param user 要添加的用户
         */
        void addUser(User user);
        
        /**
         * 移除用户
         * @param user 要移除的用户
         */
        void removeUser(User user);
    }
  2. 具体中介者 - 聊天室 (ChatMediator.java)

    java 复制代码
    package com.example.mediator;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 具体中介者 - 聊天室
     * 实现中介者接口,协调用户之间的通信
     */
    public class ChatMediator implements Mediator {
        private List<User> users;
        private String chatRoomName;
        
        public ChatMediator(String chatRoomName) {
            this.users = new ArrayList<>();
            this.chatRoomName = chatRoomName;
            System.out.println("聊天室 '" + chatRoomName + "' 已创建");
        }
        
        @Override
        public void sendMessage(String message, User sender) {
            System.out.println("\n" + sender.getName() + " 在聊天室 '" + chatRoomName + "' 发送消息: " + message);
            
            // 向所有其他用户转发消息
            for (User user : users) {
                // 不向发送者自己发送消息
                if (user != sender) {
                    user.receive(message, sender);
                }
            }
            
            // 记录系统消息
            System.out.println("消息已广播给 " + (users.size() - 1) + " 个用户");
        }
        
        @Override
        public void addUser(User user) {
            users.add(user);
            user.setMediator(this);
            System.out.println(user.getName() + " 加入了聊天室 '" + chatRoomName + "'");
        }
        
        @Override
        public void removeUser(User user) {
            users.remove(user);
            System.out.println(user.getName() + " 离开了聊天室 '" + chatRoomName + "'");
        }
        
        /**
         * 获取聊天室中的用户数量
         */
        public int getUserCount() {
            return users.size();
        }
        
        /**
         * 获取聊天室名称
         */
        public String getChatRoomName() {
            return chatRoomName;
        }
    }
  3. 同事类接口 (User.java)

    java 复制代码
    package com.example.mediator;
    
    /**
     * 同事类接口
     * 定义用户与中介者交互的方法
     */
    public abstract class User {
        protected Mediator mediator;
        protected String name;
        
        public User(String name) {
            this.name = name;
        }
        
        /**
         * 发送消息
         * @param message 消息内容
         */
        public abstract void send(String message);
        
        /**
         * 接收消息
         * @param message 消息内容
         * @param sender 发送者
         */
        public abstract void receive(String message, User sender);
        
        /**
         * 设置中介者
         * @param mediator 中介者对象
         */
        public void setMediator(Mediator mediator) {
            this.mediator = mediator;
        }
        
        /**
         * 获取用户名称
         */
        public String getName() {
            return name;
        }
    }
  4. 具体同事类 - 聊天用户 (ChatUser.java)

    java 复制代码
    package com.example.mediator;
    
    /**
     * 具体同事类 - 聊天用户
     */
    public class ChatUser extends User {
        private boolean isOnline;
        
        public ChatUser(String name) {
            super(name);
            this.isOnline = true;
        }
        
        @Override
        public void send(String message) {
            if (isOnline) {
                System.out.println("\n" + name + " 正在发送消息...");
                mediator.sendMessage(message, this);
            } else {
                System.out.println(name + " 当前离线,无法发送消息");
            }
        }
        
        @Override
        public void receive(String message, User sender) {
            if (isOnline) {
                System.out.println(name + " 收到来自 " + sender.getName() + " 的消息: " + message);
            } else {
                // 离线消息处理逻辑
                System.out.println(name + " 离线,消息已存储");
            }
        }
        
        /**
         * 设置在线状态
         * @param online 是否在线
         */
        public void setOnline(boolean online) {
            this.isOnline = online;
            String status = online ? "上线" : "离线";
            System.out.println(name + " 已" + status);
        }
        
        /**
         * 获取在线状态
         */
        public boolean isOnline() {
            return isOnline;
        }
    }
  5. 主程序 (Main.java)

    java 复制代码
    package com.example.mediator;
    
    /**
     * 主程序 - 演示中介者模式
     */
    public class Main {
        public static void main(String[] args) {
            System.out.println("======= 中介者模式演示 - 聊天室应用 =======");
            
            // 创建中介者 - 聊天室
            ChatMediator chatRoom = new ChatMediator("设计模式讨论组");
            
            // 创建用户
            User alice = new ChatUser("Alice");
            User bob = new ChatUser("Bob");
            User charlie = new ChatUser("Charlie");
            User diana = new ChatUser("Diana");
            
            // 将用户加入聊天室
            chatRoom.addUser(alice);
            chatRoom.addUser(bob);
            chatRoom.addUser(charlie);
            chatRoom.addUser(diana);
            
            System.out.println("\n======= 开始聊天 =======");
            
            // 用户发送消息
            alice.send("大家好!今天我们来讨论中介者模式。");
            bob.send("中介者模式可以减少对象之间的直接耦合,对吧?");
            
            // 设置用户离线
            ((ChatUser)charlie).setOnline(false);
            
            // 继续发送消息
            diana.send("是的,它通过引入中介对象来协调对象间的交互。");
            
            // 离线用户发送消息
            charlie.send("这个模式在GUI开发中很常用。");
            
            // 用户重新上线
            ((ChatUser)charlie).setOnline(true);
            bob.send("Charlie,你回来了!");
            charlie.send("是的,我刚刚离线了一会儿。");
            
            // 移除用户
            chatRoom.removeUser(diana);
            
            // 剩余用户继续聊天
            alice.send("Diana离开了,我们继续讨论。");
            
            System.out.println("\n======= 聊天结束 =======");
            System.out.println("聊天室 '" + chatRoom.getChatRoomName() + "' 中还有 " + chatRoom.getUserCount() + " 个用户");
            
            // 演示中介者模式的另一个例子 - 飞机交通控制
            System.out.println("\n\n======= 中介者模式另一个例子 - 飞机交通控制 =======");
            
            // 创建航空交通控制中心
            Mediator atc = new AirTrafficControl();
            
            // 创建飞机
            User flight101 = new Flight("Flight-101", atc);
            User flight202 = new Flight("Flight-202", atc);
            User flight303 = new Flight("Flight-303", atc);
            
            // 飞机发送状态
            flight101.send("正在请求降落许可");
            flight202.send("正在爬升到10000英尺");
            flight303.send("报告当前位置:纬度40.7,经度-74.0");
        }
        
        /**
         * 另一个中介者实现 - 航空交通控制
         */
        static class AirTrafficControl implements Mediator {
            @Override
            public void sendMessage(String message, User user) {
                System.out.println("【航空交通控制中心】收到来自 " + user.getName() + " 的消息: " + message);
                System.out.println("【航空交通控制中心】正在处理请求...");
            }
            
            @Override
            public void addUser(User user) {
                System.out.println("【航空交通控制中心】" + user.getName() + " 已注册");
            }
            
            @Override
            public void removeUser(User user) {
                System.out.println("【航空交通控制中心】" + user.getName() + " 已注销");
            }
        }
        
        /**
         * 另一个同事类实现 - 飞机
         */
        static class Flight extends User {
            public Flight(String name, Mediator mediator) {
                super(name);
                this.mediator = mediator;
                mediator.addUser(this);
            }
            
            @Override
            public void send(String message) {
                System.out.println(name + " 发送: " + message);
                mediator.sendMessage(message, this);
            }
            
            @Override
            public void receive(String message, User sender) {
                System.out.println(name + " 收到来自控制中心的指令: " + message);
            }
        }
    }

3. 构建和运行

  1. 构建项目

    bash 复制代码
    mvn clean compile
  2. 运行程序

    bash 复制代码
    mvn exec:java -Dexec.mainClass="com.example.mediator.Main"

4. 核心概念

项目解释:

  • Mediator(中介者接口):定义同事对象与中介者交互的接口

  • ConcreteMediator(具体中介者):实现中介者接口,协调各同事对象的行为

  • Colleague(同事类):定义同事类的接口,每个同事对象都知道中介者对象

  • ConcreteColleague(具体同事类):实现同事类接口,与其他同事对象通过中介者通信

模式优点:

  • 减少耦合:将对象间多对多的关联转变为一对多的关联,降低了对象之间的耦合度

  • 集中控制:将交互逻辑集中在中介者中,使得交互更容易理解和维护

  • 可扩展性:新增同事类时只需要与中介者交互,不需要修改其他同事类

适用场景:

  • 当对象之间存在复杂的引用关系时

  • 当需要创建一个运行于多个类之间的公共行为,又不想生成太多子类时

  • GUI应用程序中多个组件之间的交互

  • 聊天应用程序

  • 航空交通控制系统

  • 事件分发系统

相关推荐
__万波__5 小时前
二十三种设计模式(十八)--中介者模式
java·设计模式·中介者模式
syt_10137 天前
设计模式之-中介者模式
设计模式·中介者模式
明洞日记1 个月前
【设计模式手册016】中介者模式 - 解耦多对象交互
c++·设计模式·交互·中介者模式
崇文殿大学士1 个月前
C# MediatR 中介者模式 观察者模式
观察者模式·c#·中介者模式
开心香辣派小星1 个月前
23种设计模式-16中介者模式
设计模式·中介者模式
o0向阳而生0o1 个月前
113、23种设计模式之中介者模式(21/23)
设计模式·中介者模式
LoveXming2 个月前
Chapter14—中介者模式
c++·microsoft·设计模式·中介者模式·开闭原则
Meteors.2 个月前
23种设计模式——中介者模式 (Mediator Pattern)详解
java·设计模式·中介者模式
bkspiderx3 个月前
C++设计模式之行为型模式:中介者模式(Mediator)
c++·设计模式·中介者模式