• 中介者模式(Mediator Pattern)


    中介者模式

    说明

    中介者模式(Mediator Pattern)属于行为型模式,又称为调解者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
    该模式主要解决的是对象间通信的问题,多个对象之间需要相互通信,如果每个对象都持有交互对象的引用,那么对象间的耦合度太高,不利用维护与扩展。中介者模式将对象间相互依赖的网状关系,重构成了星状关系,对象之间的通信交给中介者集中进行管理即可。
    在这里插入图片描述
    在这里插入图片描述

    结构

    抽象中介者(Mediator):定义各同事角色之间通信的接口,该角色根据需求创建,不是必须的;
    具体中介者(ConcreteMediator):管理具体的同事对象,并且负责它们之间的通信;
    抽象同事(Colleague):定义同一类型同事的统一行为,该角色根据需求创建,不是必须的;
    具体同事(ConcreteColleague):需要持有具体中介者的引用,与其他对象通信时,调用中介者完成。
    中介者模式-类结构图

    代码案例

    具体同事(ConcreteColleague)

    /**
     * @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));
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    具体中介者(ConcreteMediator)

    /**
     * @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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    客户端

    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("赵六", "一起去张三家玩呀!");
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    输出结果

    【李四】收到来自【张三】的消息:出来玩呀!!!
    【张三】收到来自【李四】的消息:加班呢,没空!!!
    【王五】收到来自【张三】的消息:出来玩不?
    【张三】收到来自【王五】的消息:可以啊,我来找你!!!
    对不起,用户【赵六】还未注册,发送消息失败!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    代码覆盖率统计神器-jacoco工具实战
    PLC数据采集网关是如何应用的?-天拓四方
    ✔ ★ 算法基础笔记(Acwing)(三)—— 搜索与图论(17道题)【java版本】
    Python猜拳小游戏 彩色控制台版
    JAVA计算机毕业设计书影商城系统(附源码、数据库)
    为什么有了并发安全的集合还需要读写锁?
    Java中的重载和重写
    imx6ull-arm开发板和电脑网线直连通信
    ubuntu server 安装失败
    Java项目:基于SSM框架实现的汽车养护保养管理系统【ssm+B/S架构+源码+数据库+开题+毕业论文+任务书】
  • 原文地址:https://blog.csdn.net/it_wxw/article/details/136483353