中介者模式(Mediator Pattern)

中介者模式

说明

中介者模式(Mediator Pattern)属于行为型模式,又称为调解者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

该模式主要解决的是对象间通信的问题,多个对象之间需要相互通信,如果每个对象都持有交互对象的引用,那么对象间的耦合度太高,不利用维护与扩展。中介者模式将对象间相互依赖的网状关系,重构成了星状关系,对象之间的通信交给中介者集中进行管理即可。

结构

抽象中介者(Mediator):定义各同事角色之间通信的接口,该角色根据需求创建,不是必须的;

具体中介者(ConcreteMediator):管理具体的同事对象,并且负责它们之间的通信;

抽象同事(Colleague):定义同一类型同事的统一行为,该角色根据需求创建,不是必须的;

具体同事(ConcreteColleague):需要持有具体中介者的引用,与其他对象通信时,调用中介者完成。

代码案例

具体同事(ConcreteColleague)

java 复制代码
/**
 * @program: mediator
 * @description: 用户类
 *              具体同事(ConcreteColleague)
 * @author: wxw
 * @create: 2024-03-13 11:14
 **/
@Data
@AllArgsConstructor
public class User {

    private String name;

    private MessagePlatform mp;

    // 通过中介者发送消息
    public void sendMsg(String name, String msg){
        mp.sendMsg(this, name, msg);
    }

    // 得到消息
    public void getMsg(String name, String msg){
        System.out.println(String.format("【%s】收到来自【%s】的消息:%s",this.name, name, msg));
    }

}

具体中介者(ConcreteMediator)

java 复制代码
/**
 * @program: mediator
 * @description: 短信平台
 *              具体中介者(ConcreteMediator)
 * @author: wxw
 * @create: 2024-03-13 11:16
 **/
public class MessagePlatform {

    // 保存所有需要管理的对象
    private Map<String,User> userMap = new HashMap<>();

    // 注册用户
    public void registerUesr(User user){
        userMap.put(user.getName(),user);
    }

    // 发送消息
    public void sendMsg(User send, String receive, String msg){
        if(!userMap.containsKey(receive)){
            System.out.println("对不起,用户【" + receive + "】还未注册,发送消息失败!!!");
            return;
        }

        // 转发消息
        User user = userMap.get(receive);
        user.getMsg(send.getName(), msg);
    }

}

客户端

java 复制代码
public class Test {

    public static void main(String[] args) {
        MessagePlatform mp = new MessagePlatform();
        User zs = new User("张三",mp);
        User ls = new User("李四",mp);
        User ww = new User("王五",mp);
        User zl = new User("赵六",mp);

        // 注册张三、李四、王五,赵六未注册
        mp.registerUesr(zs);
        mp.registerUesr(ls);
        mp.registerUesr(ww);

        zs.sendMsg("李四", "出来玩呀!!!");
        ls.sendMsg("张三", "加班呢,没空!!!");
        zs.sendMsg("王五", "出来玩不?");
        ww.sendMsg("张三","可以啊,我来找你!!!");
        ww.sendMsg("赵六", "一起去张三家玩呀!");

    }
}

输出结果

bash 复制代码
【李四】收到来自【张三】的消息:出来玩呀!!!
【张三】收到来自【李四】的消息:加班呢,没空!!!
【王五】收到来自【张三】的消息:出来玩不?
【张三】收到来自【王五】的消息:可以啊,我来找你!!!
对不起,用户【赵六】还未注册,发送消息失败!!!
相关推荐
ID_180079054733 小时前
YouTube item_get_video接口认证方式:API密钥与OAuth2.0的选择与应用
服务器·windows·microsoft
星火开发设计7 小时前
Java面向对象三大特性:封装、继承与多态的深度解析及实战
java·开发语言·microsoft·多态·继承·面向对象·封装
牛猫Data15 小时前
Power BI为什么不能完全取代Excel?
microsoft·数据分析·excel·database·数据可视化·powerbi
霖雨17 小时前
备份 SQL Server 到 Azure Storage
后端·python·microsoft·flask·azure
杜子不疼.1 天前
【AI】基于GLM-4_7与数字人SDK的政务大厅智能指引系统实践
人工智能·microsoft·政务
kaka.liulin -study1 天前
EmberTrace AI | Multimodel Map GIS: 基于多智能体协作的地图自主化分析技术
人工智能·microsoft
小陈phd2 天前
langGraph从入门到精通(四)——基于LangGraph的State状态模式设计
python·microsoft·状态模式
viperrrrrrrrrr72 天前
DeepSeek-V4架构详解
microsoft·deepseek-v4
拓端研究室2 天前
2026年人形机器人展望报告:市场趋势、技术创新与行业应用|附300+份报告PDF、数据、可视化模板汇总下载
大数据·人工智能·microsoft
2501_941982052 天前
企业微信外部群自动化消息推送实战
microsoft·自动化·企业微信