设计模式之中介者模式

news2024/11/19 14:46:09

Mediator design pattern

中介者模式的概念、中介者模式的结构、中介者模式的优缺点、中介者模式的使用场景、中介者模式的实现示例、中介者模式的源码分析


1、中介者模式的概念

  中介者模式,又称调停模式,即定义一个中介者来封装原有多个对象之间的依赖关系,且可以独立改变它们之间的交互,以降低对象之间的耦合度。其是迪米特法则的典型应用。

2、中介者模式的结构

  • 抽象中介者:定义关联关系注册和转发关联事件的行为。
  • 具体中介者:实现抽象中介者,实现其定义的关联关系注册和转发关联关系的行为,其声明了一个关联者列表,用来维护注册进来的关联者。
  • 抽象关联者:定义接受关联事件和发送关联事件的行为。
  • 具体关联者:实现抽象关联者,实现其定义的接受关联事件和发送关联事件的行为,其持有一个抽象中介者的引用,发送关联事件的实现实际上是委托给抽象中介者的引用实现的。

mediator-class

3、中介者模式的优缺点

  • 优点:
    • 松散耦合。通过中介者,降低了个关联对象之间的耦合度。
    • 集中控制交互:多个关联对象之间的交互,被封装在中介者对象中,使得这些交互行为发生变化时,只需要修改或者扩展中介者对象即可。
    • 一对多关联转变为一对一关联。中介者对象的引入,使得关联对象之间的关系更容易理解和实现。
  • 缺点:
    • 当关联者类太多时,中介者的职责将很大,会变得复杂而庞大,以助于系统难以维护。

4、中介者模式的使用场景

  • 当系统中对象之间存在复杂的引用,系统结构混乱且难以理解时。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

5、中介者模式的实现示例

抽象中介者:

public interface Mediator {

    /**
     * 注册关联关系
     * @param relation
     */
    void registerRelation(Relation relation);

    /**
     * 转发关联事件
     * @param relation
     * @param message
     */
    void relay(Relation relation, String message);
}

具体中介者:

public class ConcreteMediator implements Mediator {

    private List<Relation> relations;

    public ConcreteMediator() {
        this.relations = new ArrayList<>();
    }

    @Override
    public void registerRelation(Relation relation) {
        if (!this.relations.contains(relation)) {
            relation.setMediator(this);
            this.relations.add(relation);
        }
    }

    @Override
    public void relay(Relation relation, String message) {
        for (Relation relation1 : this.relations) {
            if (!relation.equals(relation1)) {
                relation1.receive(relation, message);
            }
        }
    }
}

抽象关联者:

public abstract class Relation {

    protected String name;

    protected Mediator mediator;

    public Relation(String name) {
        this.name = name;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

    /**
     * 接受事件
     * @param relation
     * @param message
     */
    public abstract void receive(Relation relation, String message);

    /**
     * 发送事件
     * @param message
     */
    public abstract void send(String message);
}

具体关联者一:

public class OneRelation extends Relation {

    public OneRelation(String name) {
        super(name);
    }

    @Override
    public void receive(Relation relation, String message) {
        System.out.println(this.name + " 接受到了 " + relation.getName() + " 的消息 " + message);
    }

    @Override
    public void send(String message) {
        this.mediator.relay(this, message);
    }
}

具体关联者二:

public class TwoRelation extends Relation {

    public TwoRelation(String name) {
        super(name);
    }

    @Override
    public void receive(Relation relation, String message) {
        System.out.println(this.name + " 接受到了 " + relation.getName() + " 的消息 " + message);
    }

    @Override
    public void send(String message) {
        this.mediator.relay(this, message);
    }
}

测试:

public class MediatorTest {

    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        mediator.registerRelation(new OneRelation("zed"));
        mediator.registerRelation(new TwoRelation("fizz"));
        mediator.registerRelation(new TwoRelation("ahri"));

        Relation relation = new OneRelation("Ashe");
        mediator.registerRelation(relation);

        relation.send("别杀了 给条活路吧!");

    }
}

测试结果:

zed 接受到了 Ashe 的消息 别杀了 给条活路吧!
fizz 接受到了 Ashe 的消息 别杀了 给条活路吧!
ahri 接受到了 Ashe 的消息 别杀了 给条活路吧!

6、中介者模式的源码分析

404

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

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

相关文章

SpringBoot中Redis使用之jedis

目录 pom.xml中导入坐标 application.yml添加配置 lettcus与jedis区别 本人springboot版本2.7.6&#xff0c;redis版本5.0.14.1亲测可用 pom.xml中导入坐标 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId&…

大学生自学Python去面试,月薪为何如此少?问题究竟出在哪?

市场上需要的Python人员非常多&#xff0c;而且按照现在的势头&#xff0c;以后会需要更多的Python开发人员&#xff0c;理由是以后每个人公司都会有自己的网站&#xff0c;有自己的开发部&#xff0c;对于用户体验看的非常重要。所以Python程序员就会很吃香。随时时间的推移&a…

62354-43-2,标记肽vLK-对硝基苯胺

很多蛋白在细胞中非常容易被降解&#xff0c;或被标记&#xff0c;进而被选择性地破坏。但含有部分D型氨基酸的多肽则显示了很强的抵抗蛋白酶降解能力。 纤溶酶和微纤溶酶的底物。微纤溶蛋白水解D-VLK-pNA的Km为0.361 /- 0.017 mM, kcat为40.3 /- 3.3 s&#xff0c;而原生纤溶蛋…

非零基础自学Golang 第12章 接口与类型 12.2 接口的创建与实现 12.2.2 接口赋值

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.2 接口的创建与实现12.2.2 接口赋值第12章 接口与类型 12.2 接口的创建与实现 12.2.2 接口赋值 如果用户自定义的类型实现了某个接口类型所声明的一组方法&#xff0c;那么这个用户定义的类型的值就可以赋…

2021遥感应用组三等奖:基于PolSAR和高光谱遥感的黄河口湿地协同分类研究

作品介绍 一、作品概述 受人类活动和气候变化的影响,滨海湿地正经历着显著的变化。滨海湿地生态系统的监测具有重要的现实意义。同时,随着卫星遥感技术的快速发展,可以利用高空间分辨率、高光谱分辨率和高时间分辨率的多源数据对滨海湿地进行高精度分类。 本作品利用珠海1…

磨金石教育摄影技能干货分享|优秀手机摄影作品欣赏

在摄影中&#xff0c;动物摄影并不好拍&#xff0c;因为动物的姿态&#xff0c;所处的环境都不是人所能控制。所以需要摄影师们提早调整好参数&#xff0c;耐心的等待和观察。而且要反复多拍&#xff0c;才能得到心仪的照片。 这些还只是普通的动物摄影&#xff0c;还有难度更高…

sg90舵机基本认知

什么是舵机&#xff1a; 如下图所示&#xff0c;最便宜的舵机sg90&#xff0c;常用三根或者四根接线&#xff0c;黄色为PWM信号控制 用处&#xff1a;垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等 常见的有0-90、0-180、0-360 怎末控制电机&#xff1f; …

硬件设备运行小程序,FinClip来帮忙

如今小程序技术日趋成熟&#xff0c;但大多小程序的运行都依赖于微信、百度、支付宝、今日头条等各大巨头&#xff0c;使得小程序的运营十分受限。并且&#xff0c;企业也更希望能实现“一次开发&#xff0c;多端运行”。因此&#xff0c;今天就来跟大家分享一下离开各大巨头&a…

20款前端特效动画及源码

最近优化项目时看到一些实用的特效 感觉还不错 下面就分享给大家 代码量过长的我就不展示了 可以去在这里资源站源码部分预览下载 1.Loading加载动画 在canvas画布上&#xff0c;我们动态绘制许多多边形&#xff0c;这些多边形伴随着颜色的随机变化和旋转&#xff0c;形成了奇…

KingbaseES Clusterware 高可用案例之---构建iSCSI共享存储

案例说明&#xff1a; 在KingbaseES Clusterware高可用的架构中&#xff0c;集群节点需要访问共享的存储设备&#xff0c;可以使用FC SAN、iscsi SAN、NAS等存储设备。本案例详细描述了&#xff0c;在Linux系统下构建 iscsi存储服务器及客户端访问的过程&#xff0c;为部署King…

8Manage SRM电子采购软件为企业带来采购优势

在如今各行行业竞争激烈的环境中&#xff0c;企业想要从中脱颖而出&#xff0c;利用现代化电子采购软件来建立优势是必不可少的。采用电子采购软件的优势越来越明显&#xff0c;其许多用途也越来越为人所知。企业使用电子采购的主要原因是为了控制强大的库存、减少采购重复和改…

GNU编译器常见伪操作

伪操作不会生成机器码&#xff0c;只是在编译阶段告诉编译器怎么做。类似于C语言中的 #if、#define 等带“#”的&#xff0c;#if 告诉编译器哪段不需要被编译&#xff0c;#define 告诉编译器哪些宏需要替换。 不同编译器&#xff0c;伪操作的语法不一样&#xff0c;这里主要介…

python帮我省下了这笔冤枉钱

背景 今天不得不说一说我这个电脑的事情。我这个电脑是2年前买的&#xff0c;屏幕非常大&#xff0c;是16寸的。 基本上没什么缺点&#xff0c;就是每隔一年&#xff0c;就要处理一下储存问题。 为什么呢&#xff0c;因为我的这台电脑的储存是512G的。所以不是太大。 但是今天…

【小学信息技术教资面试】《英文汉字巧切换》教案

题目&#xff1a;英文汉字巧切换内容&#xff1a; 基本要求&#xff1a; &#xff08;1&#xff09; 请在10分钟内完成试讲。 &#xff08;2&#xff09; 灵活切换汉字和英文字符。 &#xff08;3&#xff09; 试讲过程中涉及操作&#xff0c;进行演示即可。 《英文汉字巧切换…

如何准备考pmp?

我考的是旧考纲&#xff0c;5A 通过的&#xff0c;备考经验大家可以参考下&#xff0c;取长补短~ 一、复习计划的制定 根据之前在培训班共同奋斗的小伙伴学习时间统计&#xff0c;平均每天的学习时间是在 3-4 小时左右&#xff0c;基本上是白天 1 小时晚上 3 小时左右&#xf…

MySQL (二)------MySQL的使用、SQL的介绍

1.1 MySQL服务的启动 “我的电脑/计算机”-->右键-->“管理”-->“服务”-->启动和关闭MySQL服务 “开始菜单”-->“控制面板”-->“管理工具”-->“服务”-->启动和关闭MySQL “任务管理器”-->“服务”-->启动和关闭MySQL 或者 以管理员…

SQL练习题之求每个部门工资最高的人

冬至&#xff0c;又称日南至、冬节、亚岁。 文章目录前言一、题目二、表数据三、解答方法四、延伸思考题外话前言 分享自己做SQL练习时遇到的经典题目&#xff0c;供各位小伙伴参考。 一、题目 现有员工表employee&#xff0c;求每个部门工资最高的前五个员工的 id, name, de…

硬件系统工程师宝典(1)-----硬件系统设计应该从哪里开始?

系统设计举足轻重的一步&#xff0c;需求分析 今天我们开始读张志伟老师的《硬件系统工程师宝典》&#xff0c;这是一本非常好的入门书&#xff0c;对需求分析&#xff0c;电源、信号完整性&#xff0c;电源完整性&#xff0c;可制造性&#xff0c;原理图&#xff0c;pcb的详细…

风控特征变量如何命名

风控变量的命名相信是各位小伙伴&#xff0c;不管是策略还是模型开发的同学都会经常遇到的问题。如果变量不多&#xff0c;假设变量也就只有十几二十个左右&#xff0c;相信大家也不需要怎么处理&#xff0c;或许下面这样的简单命名方式就好了&#xff1a; 如VAR1~VARN&#x…

一套Abaqus常用子程序的二次开发和复杂应用攻略

当物体所受载荷是比较复杂的函数时&#xff08;如与时间、位置等相关&#xff09;&#xff0c;通过界面输入的方式已经难以实现&#xff0c;通常便需要借助于DLOAD子程序来实现。下面将就ABAQUS软件的DLOAD子程序进行讲解和应用举例&#xff0c;希望通过此次讲解能够让更多的同…