大话设计模式——中介者

news2024/12/23 4:23:39

5. 中介者(Mediator)

Intent

集中相关对象之间复杂的沟通和控制方式。

Class Diagram

  • Mediator:中介者,定义一个接口用于与各同事(Colleague)对象通信。
  • Colleague:同事,相关对象

Implementation

Alarm(闹钟)、CoffeePot(咖啡壶)、Calendar(日历)、Sprinkler(喷头)是一组相关的对象,在某个对象的事件产生时需要去操作其它对象,形成了下面这种依赖结构:


使用中介者模式可以将复杂的依赖结构变成星形结构:


public abstract class Colleague {
    public abstract void onEvent(Mediator mediator);
}
public class Alarm extends Colleague {

    @Override
    public void onEvent(Mediator mediator) {
        mediator.doEvent("alarm");
    }

    public void doAlarm() {
        System.out.println("doAlarm()");
    }
}
public class CoffeePot extends Colleague {
    @Override
    public void onEvent(Mediator mediator) {
        mediator.doEvent("coffeePot");
    }

    public void doCoffeePot() {
        System.out.println("doCoffeePot()");
    }
}
public class Calender extends Colleague {
    @Override
    public void onEvent(Mediator mediator) {
        mediator.doEvent("calender");
    }

    public void doCalender() {
        System.out.println("doCalender()");
    }
}
public class Sprinkler extends Colleague {
    @Override
    public void onEvent(Mediator mediator) {
        mediator.doEvent("sprinkler");
    }

    public void doSprinkler() {
        System.out.println("doSprinkler()");
    }
}
public abstract class Mediator {
    public abstract void doEvent(String eventType);
}
public class ConcreteMediator extends Mediator {
    private Alarm alarm;
    private CoffeePot coffeePot;
    private Calender calender;
    private Sprinkler sprinkler;

    public ConcreteMediator(Alarm alarm, CoffeePot coffeePot, Calender calender, Sprinkler sprinkler) {
        this.alarm = alarm;
        this.coffeePot = coffeePot;
        this.calender = calender;
        this.sprinkler = sprinkler;
    }

    @Override
    public void doEvent(String eventType) {
        switch (eventType) {
            case "alarm":
                doAlarmEvent();
                break;
            case "coffeePot":
                doCoffeePotEvent();
                break;
            case "calender":
                doCalenderEvent();
                break;
            default:
                doSprinklerEvent();
        }
    }

    public void doAlarmEvent() {
        alarm.doAlarm();
        coffeePot.doCoffeePot();
        calender.doCalender();
        sprinkler.doSprinkler();
    }

    public void doCoffeePotEvent() {
        // ...
    }

    public void doCalenderEvent() {
        // ...
    }

    public void doSprinklerEvent() {
        // ...
    }
}
public class Client {
    public static void main(String[] args) {
        Alarm alarm = new Alarm();
        CoffeePot coffeePot = new CoffeePot();
        Calender calender = new Calender();
        Sprinkler sprinkler = new Sprinkler();
        Mediator mediator = new ConcreteMediator(alarm, coffeePot, calender, sprinkler);
        // 闹钟事件到达,调用中介者就可以操作相关对象
        alarm.onEvent(mediator);
    }
}
doAlarm()
doCoffeePot()
doCalender()
doSprinkler()

JDK

  • All scheduleXXX() methods of java.util.Timer
  • java.util.concurrent.Executor#execute()
  • submit() and invokeXXX() methods of java.util.concurrent.ExecutorService
  • scheduleXXX() methods of java.util.concurrent.ScheduledExecutorService
  • java.lang.reflect.Method#invoke()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「轻解压」怎么解?小红书用户画像告诉你

“轻养生”、“轻运动”……一个“轻”字,高度概括了如今年轻人面对生活的态度。今年,「轻解压」成为新的主题词,被广泛提及。 相比传统解压方式,轻解压更讲究愉悦感和生活感。用户通过围观开榴莲、沉浸式收纳等看似与解压毫无关…

MySQL数据库+增删改查

文章目录 MySQL数据库1 基本概念2 数据库系统2.1 操作数据库2.2 分类2.3 常见数据类型 3 SQL语句3.1 DDL3.1.1 创建数据库3.1.2 创建表3.1.3 删除数据库3.1.4 删除表3.1.5 查看所有数据库3.1.6 查看数据表 3.2 DML3.2.1 插入数据3.2.2 删除数据3.2.3 更新数据 3.3 DQL3.3.1 显示…

项目管理专业人员能力评价(CSPM)相关问题汇总,看这篇就够了!

问题导览: 1、国标项目管理(项目管理专业人员能力评级)证书是什么? 2、国标项目管理(项目管理专业人员能力评级)证书有几级? 3、项目管理专业人员能力等级证书的价值(含金量&#…

2023年年度最佳配色就是它-我已经为大家配好了色卡,还不快来用?

洋红或者又称为胭脂红 今年的「洋红万岁」,PANTONE 称其是[非常规时代的非常规红] 它源自 PANTONE 的红色家族,灵感来自一种叫胭脂虫的小昆虫,在色轮上介于红色和粉红色之间,是天然染料家族中最珍贵的染料之一,也是世界上已知的最浓烈、最明亮的染料之一。 据 PANTONE …

oxygen技术文档编写教程

CSS样式 https://www.oxygenxml.com/doc/versions/24.1/ug-editor/topics/dg-css-stylesheet.html (其他参考链接:https://zhuanlan.zhihu.com/p/480000063) 插件 https://www.oxygenxml.com/addons.html 官方template https://styles.o…

量子网络商业化的时代来了吗?

光子盒研究院 现在,一个利用量子“纠缠”在遥远的用户之间编织亲密联系的全球网络正在开始形成。 ——田纳西州的这个城市曾推出美国第一个全市范围的千兆比特互联网服务。现在,它将推出全美第一个商业化的量子网络。 2010年,查塔努加市因“成…

双功能螯合剂:MeTz-PEG11-NOTA,甲基四嗪十一聚乙二醇NOTA,试剂有哪些特点?

产品描述: MeTz-PEG11-NOTA(甲基四嗪-PEG11-NOTA)通过PEG进行连接两端甲基四嗪和NOTA,其中亲水性PEG间隔臂提供了一个长而灵活的连接,一定限度地减少了与含四嗪的复合分子连接有关的空间位阻。NOTA及其衍生物具有良好的…

安装PowerDesigner

安装PowerDesigner(文章附上安装所需要的安装包) 环境:windows10操作系统、PowerDesigner16.5版 1、双击PowerDesigner16.5安装包进行安装 选择Trial,再点击Next,别选错哈 选择hongkong,并且点击agree …

64G超大容量内存条599,光威天策DDR4 32×2原地起飞

- 光威天策DDR4 64G套装,599元享受极速体验 - 599元升级64G内存,光威天策DDR4给你惊喜 - 光威天策DDR4 64G内存条,简约外观,强劲性能 - 超值618,光威天策DDR4 64G内存条,速度快,散热好 很多热爱…

企业想要搭建CRM平台该如何操作?

如今,企业数字化转型的浪潮依然汹涌。而CRM客户管理平台是企业实现数字化转型,提升市场竞争力的重要工具。那么,企业如何搭建CRM客户管理平台?下面我们就这个问题来说一下。 一、明确业务目标和需求 企业需要明确业务目标&#…

在 Blender、ZBrush 和 Substance 3D Painter 中创建幻想角色

今天瑞云渲染小编给大家带来一篇关于Obafunso Dorgu 作者Serenity 项目背后的工作流程,告诉我们这些衣服是如何在 Marvelous Designer 中制作的,并提到了设置逼真的头发的重要事项。 介绍 大家好,我叫Obafunso Dorgu,我是一名自…

Python+Appium实现自动化测试的使用步骤

这篇文章主要介绍了PythonAppium实现自动化测试的使用步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 一、环境准备 1.脚本语言:Python3.x IDE&am…

【数据分享】1929-2022年全球站点的逐年平均能见度(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到常用的能见度数据,最详细的能见度数据是具体到气象监测站点的能见度数据! 有关气象指标的监测站点数据,之前我们分享过1929…

有趣的数学 对称/非对称加密简史及数学原理一览

一、非对称加密简史 1、算法建立 对于任何想发送加密信息的人,另一个问题是如何让接收人知道这条信息一开始是如何加密的。对于像字母替换式密码这样的密码,问题在于,一旦窃听者知道了加密方案,后续的信息都可以轻松获取。 公钥加…

【北邮国院大三下】Intellectual Property Law 知识产权基础 Week4

北邮国院大三电商在读,随课程进行整理知识点。仅整理PPT和相关法条中相对重要的知识点,个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处,祝您学习愉快。 如需要pdf格式的文件请私信联系或微信联系 PRC是否inf…

Android Framework分析Launcher启动过程

简介: Launcher是Android系统中默认的桌面应用程序,负责管理设备的屏幕和应用程序图标。本文将详细介绍Launcher的启动过程,并使用源代码示例进行说明。 Launcher的启动过程: 下面是Launcher的启动过程的详细步骤: …

开源软件介绍——开源基金会和开源许可证

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来看一看世界范围内知名的开源基金会和开源许可证。 开源基金会 基金会是开源生态中的一个重要组成部分,用于资金的筹集与开源项目的前期资助与后期的发展。这里将介绍部分重要基金会&am…

嵌入式Linux时间同步 gpsd+chrony+pps

硬件设计 GNSS模块输出pps到CPU,1PPS_1.8V用于V2X的pps,GPIO35_1.8V用于pps-gpio。这里做了pps一分二,由于距离太近不影响功能,焊接R35 0欧电阻。 驱动配置 gps_pps_pins:ublox_gps2 {leadcore,pins "gpio34";leadcore…

echarts几个公司内部数据可视化图表必

目录 折线图 日负荷折线图最大需求表柱状图 日电量柱状图分时电量功率因数三相温度水球图 年月日负荷率图散点图 三相平衡 最近公司有一个需求,要做一个数据可视化的页面,所有的图表都在下面,做这些都是本人自己写的,全部都是真…

【笔记】Fastapi 服务器部署无法访问接口

主要原因: # 主函数 if __name__ "__main__":uvicorn.run(appmain:app, host127.0.0.1, port8181, reloadFalse)以上都是测试环境,可以使用127.0.0.1,但是服务器上不能用这个地址,要改为0.0.0.0。 参考:服…