18.设计模式 MEDIATOR(中介者)

一、模式定义与核心思想

中介者模式是一种行为型设计模式,其核心目标是通过引入中介对象封装多个对象间的交互,将原本复杂的网状依赖转化为星型结构,实现松耦合集中控制。该模式通过将对象间的通信逻辑抽象到中介层,赋予系统以下核心价值:

  1. 解耦对象依赖:消除对象间的直接引用,降低耦合度(如飞机通过塔台调度而非直接协商)。
  2. 统一交互规则:集中管理通信协议与业务流程(如聊天室消息路由、智能家居场景联动)。
  3. 动态扩展性:新增对象只需与中介交互,无需修改现有逻辑(如新增设备至智能家居系统)。

经典场景

  • 多组件GUI界面的事件分发(如表单验证联动)
  • 分布式系统的服务协调(如微服务注册中心)
  • 游戏引擎中的角色行为调度(如战斗状态同步)

二、模式组成与UML类图

核心角色
  1. Mediator(抽象中介者)
  • 定义通信接口(如notify()方法),声明对象间交互规则。
  1. ConcreteMediator(具体中介者)
  • 实现交互逻辑,维护同事对象集合(如ChatServer管理用户列表)。
  1. Colleague(抽象同事类)
  • 持有中介者引用,定义通信方法(如send()receive())。
  1. ConcreteColleague(具体同事类)
  • 实现业务逻辑,通过中介者传递消息(如聊天室用户、智能家居设备)。
UML类图
classDiagram
    class Mediator {
        <<interface>>
        +notify(sender: Colleague, event: String)
    }

    class ConcreteMediator {
        -colleagues: List<Colleague>
        +register(colleague: Colleague)
        +notify(sender: Colleague, event: String)
    }

    class Colleague {
        <<abstract>>
        -mediator: Mediator
        +send(event: String)
        +receive(event: String)
    }

    class ConcreteColleagueA {
        +send(event: String)
        +receive(event: String)
    }

    class ConcreteColleagueB {
        +send(event: String)
        +receive(event: String)
    }

    Mediator <|-- ConcreteMediator
    Colleague <|-- ConcreteColleagueA
    Colleague <|-- ConcreteColleagueB
    ConcreteMediator --> Colleague : manages
    Colleague --> Mediator : delegates


三、代码实现示例

场景:实现智能家居设备联动(灯光、空调、音响)

// 1. 抽象中介者
interface SmartHomeMediator {
    void registerDevice(Device device);
    void notify(Device sender, String event);
}

// 2. 具体中介者(中央控制器)
class CentralController implements SmartHomeMediator {
    private List<Device> devices = new ArrayList<>();

    @Override
    public void registerDevice(Device device) {
        devices.add(device);
    }

    @Override
    public void notify(Device sender, String event) {
        for (Device device : devices) {
            if (device != sender) {
                device.receive(event);
            }
        }
    }
}

// 3. 抽象同事类
abstract class Device {
    protected SmartHomeMediator mediator;

    public Device(SmartHomeMediator mediator) {
        this.mediator = mediator;
        mediator.registerDevice(this);
    }

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

// 4. 具体同事类
class Light extends Device {
    public Light(SmartHomeMediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String event) {
        System.out.println("[灯光] 发送事件: " + event);
        mediator.notify(this, event);
    }

    @Override
    public void receive(String event) {
        if ("回家模式".equals(event)) {
            System.out.println(">> 灯光自动开启");
        } else if ("离家模式".equals(event)) {
            System.out.println(">> 灯光自动关闭");
        }
    }
}

class AirConditioner extends Device {
    public AirConditioner(SmartHomeMediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String event) {
        System.out.println("[空调] 发送事件: " + event);
        mediator.notify(this, event);
    }

    @Override
    public void receive(String event) {
        if ("回家模式".equals(event)) {
            System.out.println(">> 空调调至26℃");
        }
    }
}

// 5. 客户端调用
public class Client {
    public static void main(String[] args) {
        SmartHomeMediator mediator = new CentralController();
        Device light = new Light(mediator);
        Device ac = new AirConditioner(mediator);

        light.send("回家模式"); // 触发联动
    }
}

输出结果

[灯光] 发送事件: 回家模式
>> 空调调至26℃

四、工业级源码应用

  1. Spring MVC框架
    • DispatcherServlet作为请求分发的中介者,协调ControllerViewResolver等组件

7

14

  1. Java Timer调度器
    • Timer类通过TaskQueue管理定时任务,协调任务执行顺序

1

13

  1. 聊天服务器架构
    • 如Netty实现的聊天室,服务端作为中介者转发消息至其他客户端

2

6

  1. Android事件总线
    • EventBus库通过中介者模式解耦组件间的事件传递

3

12

  1. 微服务注册中心
    • Eureka/Nacos作为服务协调中介,管理服务发现与健康检查

7

14


五、模式对比与最佳实践

优势

  • 降低75%+的耦合度:通过集中管理交互逻辑(如智能家居场景联动)

1

4

  • 提升可维护性:修改交互规则只需调整中介者(如聊天室新增消息过滤)

6

12

局限性

  • 中介者臃肿风险:复杂系统中可能成为“上帝对象”(需按业务拆分多个中介者)

3

10

  • 性能损耗:高频交互场景可能因中介层引入延迟(如实时游戏引擎)

11

14

实践建议

  1. 明确职责边界:中介者应仅处理协调逻辑,避免包含业务代码

8

13

  1. 结合观察者模式:通过事件驱动提升扩展性(如Spring的事件监听机制)

3

14


总结

中介者模式如同软件架构的“交通指挥官”,通过集中调度协议抽象,在智能家居、分布式系统等场景中展现出强大的解耦能力。其设计精髓在于将交互复杂性封装为可管理单元,开发者需重点把控中介者的职责粒度,结合具体场景选择静态或动态实现方式,从而构建出高内聚、低耦合的弹性架构。

posted @ 2025-04-12 10:55  雾里看花的少年  阅读(44)  评论(0)    收藏  举报