设计模式之中介者模式

2023-09-15 15:01:19

尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性

大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了

中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变它们之间的交互。
在这里插入图片描述

Colleague叫做抽象同事类。
ConcreteColleague是具体抽象类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象。
Mediator是抽象中介者,定义了同事对象到中介者对象的接口。
ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事发出命令。

 class Program
    {
        static void Main(string[] args)
        {
            //生成一个具体中介者
            ConcreteMediator m = new ConcreteMediator();

            //让两个具体同事类认识中介者
            ConcreteColleague1 c1 = new ConcreteColleague1(m);
            ConcreteColleague2 c2 = new ConcreteColleague2(m);

            //让中介者认识各个具体同事类对象
            m.Colleague1 = c1;
            m.Colleague2 = c2;

            c1.Send("你好,同事2");
            c2.Send("你也好,同事1");
            Console.ReadLine();
        }
    }

    //抽象中介类
    abstract class Mediator
    {
        public abstract void Send(string message, Colleague colleague);//定义一个抽象的发送消息方法,得到同事对象和发送消息


    }

    //具体中介类
    class ConcreteMediator : Mediator
    {
        //需要了解所有的具体同事对象
        private ConcreteColleague1 colleague1;
        private ConcreteColleague2 colleague2;

        public ConcreteColleague1 Colleague1
        {
            set { colleague1 = value; }
        }

        public ConcreteColleague2 Colleague2
        {
            set { colleague2 = value; }
        }



        public override void Send(string message, Colleague colleague)
        {
            if (colleague == colleague1)
            {
                colleague1.Notify(message);
            }
            else
            {
                colleague2.Notify(message);
            }
        }
    }

    //抽象同事类
    abstract class Colleague
    {
        protected Mediator mediator;

        public Colleague(Mediator mediator)
        {
            this.mediator = mediator;//构造方法,得到中介者对象
        }
    }


 
    //具体同事类
    class ConcreteColleague1 : Colleague
    {
        public ConcreteColleague1(Mediator mediator) : base(mediator)
        { }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事1得到消息:"+message);
        }

    }

    class ConcreteColleague2 : Colleague
    {
        public ConcreteColleague2(Mediator mediator) : base(mediator)
        { }
        public void Send(string message)
        {
            mediator.Send(message, this);
        }
        public void Notify(string message)
        {
            Console.WriteLine("同事2得到消息:"+message);
        }
    }
更多推荐

tdesign的文件上传(微信小程序+idea的springboot)

目录1.springboot后端1.1FileController.java1.2listener文件的ErpApplicationListener.java1.3【重点!】FileServiceImpl层1.4IFileService1.5StringUtil通用类1.6主程序加一个监听器1.7application

Spring学习笔记1 启示录

写段代码,引出Spring的好处创建个空工程,然后在工程里建模块可能是IEAD版本问题,每次建新的空工程,都需要退出重进设置下maven和Encoding新建模块持久层接口持久层实现类业务层接口业务层实现类控制层(表现层)建个测试类测试分析这个程序存在的问题假设现在新需求是因某种原因需要改变Dao层的实现类并且在业务层

Feign远程调用丢失请求头

前言我们在写服务端项目的时候,总会限制对某些资源的访问,最常见的就是要求用户先登录才能访问资源,当用户登录后就会将此次会话信息保存进session,同时返回给浏览器指定的cookie键值,下次浏览器再次访问,请求头中就会携带这个cookie,我们也以次来识别用户的登录状态,做出正确响应。一、问题有时候,我们先行登录,然

什么是 Spring Boot Starter?(InsCode AI 创作助手)

当你开始使用SpringBoot开发应用程序时,你可能会听说过SpringBootStarter,它是SpringBoot框架的一个关键概念。本篇博客将详细介绍SpringBootStarter是什么,为什么它如此重要,以及如何使用它来简化SpringBoot项目的依赖管理。什么是SpringBootStarter?S

CG Magic分享同一场景里下,VR渲染器和CR渲染器哪个好?

渲染操作时,VR渲染器和CR渲染器的对比成为常见问题了。这个问题很多人都会问。今天CGMagic小编通过一个真实的项目,就是同一场景下来比较一下VR渲染器和CR渲染器的区别。以下图为例是用来测试的场景当年的最终图。采用了当年的一个伊丽莎白大街152号的项目场景,来做一下测试。1、用VR渲染,大小为2K,这张图耗时75分

(21)多线程实例应用:双色球(6红+1蓝)

一、需求1.双色球:投注号码由6个红色球号码和1个蓝色球号码组成。2.红色球号码从01--33中选择,红色球不能重复。3.蓝色球号码从01--16中选择。4.最终结果7个号码:6+1;即33选6(红)+16选1(蓝)5.产品:能用;用户放心使用;原则:靠运气,不能有暗箱操作,号码开奖的随机性。6.做法思路:(1)从左往

短视频矩阵源码系统

一、什么是短视频矩阵源码?短视频矩阵源码是一种基于短视频平台的软件程序,它可以帮助用户在多个短视频平台上进行短视频营销。短视频矩阵源码包含了多种功能,例如短视频上传、短视频批量管理、短视频数据分析等等。用户可以根据自己的需求,选择不同的功能来实现短视频营销的目标。二、短视频矩阵源码的优势是什么?节省时间和人力成本:短视

智能热水器丨打造智能家居新体验

随着科学技术的不断发展,智能电器越来越被大众所采纳,如智能扫地机,智能洗衣机,智能微波炉等等,越来越智能的电器为人们的生活带来了许多便利。以往的热水器一般都是只有按键/机械的控制方式,没有其他无线控制的控制方式。但现在新增了语音功能控制。用户通过语音控制智能热水器进行加热或保温等操作,无需用户手动控制;为人们带来了全新

微信小程序隐私授权

微信开发者平台新公告:2023年9月15之后,隐私协议将被启用,所以以后的小程序都要加上隐私协议的内容提示用户,首先设置好隐私协议的内容,登录小程序的开发者后台,在设置--》服务内容声明--》用户隐私保护指引,点击右侧的“更新”,可以在线编辑隐私协议内容,编辑完保存;然后在代码中创建一个components文件夹,用来

【ELK】日志系统&部署

一、ELK日志分析系统1、ELK的组成ElasticSearchLogStashKibanaELK基于这三个开源日志的收集、存储、检索和可视化的解决方案;可帮助用户快速定位和分析应用程序的故障,监控应用程序性能和安全,以及提供丰富的数据分析和展示功能。2、完整日志系统特征ELK是一个完整的处理分析日志的系统收集:能够采

ELK企业级日志分析系统

1.ELKELK概述ELK平台是一套完整的日志集中处理解决方案,将ElasticSearch、Logstash和Kiabana三个开源工具配合使用,完成更强大的用户对日志的查询、排序、统计需求ElasticSearch是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Elastic

热文推荐