设计模式行为型——中介者模式

news2024/9/21 16:20:39

目录

什么是中介者模式

中介者模式的实现

中介者模式角色

中介者模式类图

中介者模式代码实现

中介者模式的特点

优点

缺点

使用场景

注意事项

实际应用


什么是中介者模式

        中介者模式(Mediator Pattern)属于行为型模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,且可以独立地改变它们之间的交互。

        中介者模式又叫调停者模式,是一种对象行为型模式。

中介者模式的实现

中介者模式角色

  1. 抽象中介者角色(Mediator):抽象中介者角色定义统一的接口,以及一个或者多个事件方法,用于各同事角色之间的通信。
  2. 具体中介者角色(ConcreteMediator):实现了抽象中介者所声明的事件方法,协调各同事类之间的行为,持有所有同事类对象的引用。
  3. 抽象同事角色(Colleague):定义了抽象同事类,持有抽象中介者对象的引用。
  4. 具体同事角色(ConcreteColleague):继承抽象同事类,实现自己业务,通过中介者跟其他同事类进行通信,都需要认识中介者。

中介者模式类图

中介者模式代码实现

抽象中介者角色

package com.common.demo.pattern.mediator;

/**
 * @author Evan Walker 昂焱数据: https://www.ayshuju.com
 * @version 1.0
 * @desc 具体中介角色 具体中介者
 * @date 2023/08/04 09:27:57
 */
public class ConcreteMediator extends Mediator{

    @Override
    public void operation(Colleague colleague)
    {
        if(colleague instanceof ConcreteColleagueA) {
            colleagues.get(0).update();
        }else if(colleague instanceof ConcreteColleagueB) {
            colleagues.get(1).update();
        }
    }
}

具体中介者角色

    package com.common.demo.pattern.mediator;

    /**
     * @author Evan Walker 昂焱数据: https://www.ayshuju.com
     * @version 1.0
     * @desc 具体中介角色 具体中介者
     * @date 2023/08/04 09:27:57
     */
    public class ConcreteMediator extends Mediator{

        @Override
        public void operation(Colleague colleague)
        {
            if(colleague instanceof ConcreteColleagueA) {
                colleagues.get(0).update();
            }else if(colleague instanceof ConcreteColleagueB) {
                colleagues.get(1).update();
            }
        }
    }

抽象同事角色

package com.common.demo.pattern.mediator;

/**
 * @author Evan Walker 昂焱数据: https://www.ayshuju.com
 * @version 1.0
 * @desc 抽象同事角色 抽象同事类
 * @date 2023/08/04 09:21:50
 */
public abstract class Colleague {
    /**
     * 抽象中介者引用
     */
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    /**
     * 数据更新方法
     */
    public abstract void update();

    /**
     * 数据更改方法
     */
    public abstract void changed();
}

具体同事角色

package com.common.demo.pattern.mediator;

/**
 * @author Evan Walker 昂焱数据: https://www.ayshuju.com
 * @version 1.0
 * @desc 具体同事角色 具体同事小A
 * @date 2023/08/04 09:24:46
 */
public class ConcreteColleagueA extends Colleague{

    public ConcreteColleagueA(Mediator mediator)
    {
        super(mediator);
    }
    @Override
    public void update() {
        System.out.println("更新同事小A");
    }

    @Override
    public void changed() {
        System.out.println("同事小A数据更改");
        mediator.operation(this);
    }
}
package com.common.demo.pattern.mediator;

/**
 * @author Evan Walker 昂焱数据: https://www.ayshuju.com
 * @version 1.0
 * @desc 具体同事角色 具体同事小B
 * @date 2023/08/04 09:24:46
 */
public class ConcreteColleagueB extends Colleague{

    public ConcreteColleagueB(Mediator mediator)
    {
        super(mediator);
    }
    @Override
    public void update() {
        System.out.println("更新同事小B");
    }

    @Override
    public void changed() {
        System.out.println("同事小B数据更改");
        mediator.operation(this);
    }
}

测试代码

package com.common.demo.pattern.mediator;

/**
 * @author Evan Walker 昂焱数据: https://www.ayshuju.com
 * @version 1.0
 * @desc 具体中介角色 具体中介者
 * @date 2023/08/04 09:27:57
 */
public class ConcreteMediator extends Mediator{

    @Override
    public void operation(Colleague colleague)
    {
        if(colleague instanceof ConcreteColleagueA) {
            colleagues.get(0).update();
        }else if(colleague instanceof ConcreteColleagueB) {
            colleagues.get(1).update();
        }
    }
}

测试截图

 

中介者模式的特点

优点

  1. 解耦对象之间的交互:中介者模式将对象间的交互逻辑封装到中介者对象中,使得各个对象之间的关系变得松耦合,减少了对象之间的直接依赖。
  2. 集中控制交互逻辑:中介者模式通过集中控制对象间的交互逻辑,使得代码更加清晰可维护,易于扩展和修改。
  3. 简化对象间的通信:中介者模式将对象间的通信封装到中介者对象中,对象只需要关注自身的业务逻辑,无需了解其它对象的具体实现细节。

缺点

  1. 中介者对象过于复杂:随着系统的复杂性增加,中介者对象可能会变得庞大复杂,维护和理解起来相对困难。
  2. 增加了系统的单一点故障:中介者对象负责协调对象之间的交互,一旦中介者对象出现问题,可能会影响系统的稳定性。

使用场景

  1. 多个对象之间存在复杂的交互关系:当对象之间存在复杂的交互逻辑,并且彼此之间的依赖关系较高时,可以考虑使用中介者模式。
  2. 需要集中控制对象间交互逻辑的情况:当需要集中管理和控制多个对象的交互逻辑时,可以使用中介者模式简化系统的设计。

注意事项

  1. 中介者模式需要注意中介者对象的设计和组织方式,以及与其他对象的交互关系,避免中介者对象过于庞大和复杂。
  2. 不要滥用中介者模式,只有在对象间的交互逻辑较为复杂、耦合度较高时才考虑使用中介者模式。

实际应用

  1. 聊天室:聊天室中的用户可以通过中介者对象发送消息和接收消息,中介者负责将消息传递给其他用户。
  2. MVC框架:在MVC框架中,控制器作为中介者对象,接收用户的请求并协调模型和视图之间的交互。
  3. 航空管制系统:航空管制系统中的空中交通管制中心可以看作是中介者,负责协调各个飞机的航行和地面设施之间的交互。


更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

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

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

相关文章

Filebeat+ELK 部署

Node1节点(2C/4G):node1/192.168.8.10 Elasticsearch Kibana Node2节点(2C/4G):node2/192.168.8.11 Elasticsearch Apache节点:apache/192.168.8.13 …

Java反射学习(大综合)

第一天 Java反射及动态代理... 2 一、 Java反射... 2 1、什么是反射:... 2 2、反射的原理... 2 3、反射的优缺点:... 2 4、反射的用途:... 3 5、反射机制常用的类:... 3 1、获得Class:主要有三…

计算机基础:数据库-Sqlserver

数据库-Sqlserver 前言参考链接:关键词数据库代码案例视图触发器索引窗口函数游标小记 前言 妥妥的复习,我相信chatjpt,也相信笔记。 说实话,真正碰到问题还是先想到搜索引擎或chatjpt(即使印象中自己的笔记记过相关内容&#xf…

NVIDIA 535.86.05 Linux 图形驱动程序改进 Wayland 支持

导读NVIDIA公司近日发布了适用于 Linux、FreeBSD 和 Solaris 系统的 NVIDIA 535.86.05 图形驱动程序,作为其生产分支的维护更新,解决了各种错误和问题。 NVIDIA 535.86.05 是在 NVIDIA 535.54.03 发布一个多月之后发布的,它通过解决在使用某…

量子机器学习解决方案新鲜出炉!Rigetti和ADIALab签署合作

​ (图片来源:网络) 近日,美国全栈量子经典计算的先驱Rigetti Computing宣布与阿拉伯联合酋长国的ADIA Lab签署了合作协议,双方将共同设计、构建、运行和优化量子计算解决方案,旨在解决概率分布分类问题&am…

【腾讯云Cloud Studio实战训练营】如何成为一名合格的Python爬虫“念咒师”(基于ChatGpt)

【前言】 不管是新手程序猿,还是秃头程序猿,在工作学习中,都无法避免一项看似简单却又异常重要的环节——搭建开发环境,这常常让我们程序猿们头痛不已!毫不夸张的说,它可能是整个开发过程中最具挑战性和耗时…

Xcode protobuf2.5添加arm64编译器补丁生成静态库

项目需求,protobuf源码编成静态库使用 但是,github上的protobuf源码没有对应arm64的编译器定义,编译出来的静态库使用时报错。 下面的连接是arm64编译器代码补丁包,把编译器代码放到src/google/protobuf/stubs/atomicops_intern…

【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)

阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程,但是我没在界面看到有vnc连接,后面才发现官网有教程。 其实官网很详细了,不过这里还是…

Golang空结构体struct{}的作用是什么?

文章目录 占位符:通道标识:键集合:内存占用优化:总结: 在Go语言中,空结构体 struct{}是一种特殊的数据类型,它不占用任何内存空间。空结构体没有任何字段,也没有任何方法。尽管它看起…

Android Studio 的Gradle版本修改

使用Android Studio构建项目时,需要配置Gradle,与Gradle插件。 Gradle是一个构建工具,用于管理和自动化Android项目的构建过程。它使用Groovy或Kotlin作为脚本语言,并提供了强大的配置能力来定义项目的依赖关系、编译选项、打包方…

gradio创建机器学习的好工具 基本使用和示例

1.gradio介绍 Gradio: 用Python构建机器学习网页APP Gradio是一个开源的Python库,用于构建演示机器学习或数据科学,以及web应用程序。 使用Gradio,您可以基于您的机器学习模型或数据科学工作流快速创建一个漂亮的用户界面,让用户可以”尝试“拖放他们自己的图像、粘贴文本…

飞凌嵌入式「国产」平台大盘点(二)全志系列

在上篇文章中,小编带大家一起盘点了飞凌嵌入式国产平台中的瑞芯微系列核心板。本篇文章,将继续为大家介绍的是全志系列核心板,话不多说,上干货! 全志科技 飞凌嵌入式 飞凌嵌入式与全志科技的合作始于2019年&#xff…

MobPush iOS SDK iOS实时活动

开发工具:Xcode 功能需要: SwiftUI实现UI页面,iOS16.1以上系统使用 功能使用: 需应用为启动状态 功能说明 iOS16.1 系统支持实时活动功能,可以在锁定屏幕上实时获知各种事情的进展,MobPushSDK iOS 4.0.3版本已完成适配&#xf…

Webpack5新手入门简单配置

1.初始化项目 yarn init -y 2.安装依赖 yarn add -D webpack5.75.0 webpack-cli5.0.0 3.新建index.js 说明:写入下面的一句话 console.log("hello webpack"); 4.执行命令 说明:如果没有安装webpack脚手架就不能执行yarn webpack&#xff08…

光电新风向——氮化镓

根据维基百科词条,氮化镓(GaN、Gallium nitride)是氮和镓的化合物,是一种 III 族和 V 族的直接能隙(direct bandgap)的半导体。自1990年起常用在发光二极管中。此化合物结构类似纤锌矿,硬度很高…

无人驾驶实战-第五课(动态环境感知与3D检测算法)

激光雷达的分类: 机械式Lidar:TOF、N个独立激光单元、旋转产生360度视场 MEMS式Lidar:不旋转 激光雷达的输出是点云,点云数据特点: 简单:x y z i (i为信号强度) 稀疏:7%&…

[比赛简介]OTTO – Multi-Objective Recommender System

比赛链接 比赛简介 本次竞赛的目标是预测电子商务点击、购物车添加和订单。您将根据用户会话中的先前事件构建多目标推荐系统。 您的工作将有助于改善所有相关人员的购物体验。客户将收到更多量身定制的建议,而在线零售商可能会增加销售额。 在线购物者可以从大…

服务提供者能实现失效踢出是什么原理?

在Dubbo中,服务提供者可以实现失效踢出(Failover Cluster 配置中的 Failback 特性)。这个特性的原理主要涉及到Dubbo的集群容错和故障转移机制。 Dubbo中的集群容错机制主要用于处理服务提供者的故障,确保在出现服务提供者宕机或不可用的情况下&#xff…

Spring Cloud实战案例 │ Apollo和Zuul的整合开发

Apollo是携程研发的开源配置管理中心,能够集中管理应用于不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 本案例结合一个案例介绍Apollo和Zuul的整合开发。整个应用分为4个微服务项目&…

Grafana集成prometheus(3.Grafana添加promethus数据)

添加数据库 选择Connections -> Datasources,点击Add New data source,填写Promitheus Server Url,点击 save & test完成配置 添加DashBorad 选择prometheus数据库选择code填入对应的查询公式(监控公式参考Prometheus监控公式)修改面板名称Ti…