设计模式之中介者

中介者模式介绍

中介者模式

中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。

中介者模式顾名思义,可以用我们平时生活中的房产中介去理解。房产中介就是房子拥有者和想买房子人直接的桥梁,不让二者直接交易,通过中介去做桥梁,进行沟通和交易。

中介者模式建议你停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象,通过中介者对象重定向调用行为,以间接的方式进行合作。最终,组件仅依赖于一个中介者类,无需与多个组件耦合。

类所拥有的依赖关系越少,就越易于修改、扩展或复用。

可以为所有类型的对话框抽取通用接口,进一步消弱其依赖性;接口中将声明一个所有表单元素都能使用的通知方法,可用于将元素中发生的事件通知给对话框,所有实现了该接口的对话框都能使用这个提交按钮。

中介者模式结构

  • 1、组件

是包含业务逻辑的类。每一个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件并不知道中介者所属的类,这样就可通过将其连接到不同的中介者使其能在其他程序中复用。

  • 2、中介者接口

声明了与组件交流的方法,但通常仅包括一个通知方法。组件可将任意上下文(自身)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。

  • 3、具体中介者

封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理,甚至有时会对其生命周期进行管理。

  • 4、通知逻辑

组件并不知道其他组件的情况。如果组件内发生了重要事情,它只能通知中介者。中介者收到消息后能轻易地确定发送者,或许已足以去判断接下来需要触发的组件。

对于组件来说,中介者其实就是一个黑箱。发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初的谁发出了请求。

适用场景

  • 1  当某些对象和其他对象紧密耦合难以进行修改时

  • 2  一个组件过于依赖其他组件而无法在不同应用中复用时

  • 3  为了能在不同情景下复用一些基本行为,导致你需要被迫场景大量组件子类时

实现方式

  • 找到一组当前紧密耦合的类且提供其独立性能带来更大好处的类。

  • 声明中介者接口并描述中介者和各种组件之间所需的交流接口(一个接收组件的方法就够了)。

  • 实现具体中介者类。

  • 让中介者负责组件对象的创建和销毁。

  • 组件必须保存对于中介对象的引用。

  • 修改组件代码,使其可调用中介者的通知方法,而非其他组件的方法。然后将调用其他组件的代码抽取到中介者类中,并在中介者接收到该组件通知时执行这些代码。

满足单一职责、开闭原则、减轻应用中多个组件间的耦合情况、方便复用各个组件。

中介者将系统中组件的沟通行为中心化。各组件只知道中介者对象,无法直接相互交流。

中介者的主要目标是消除一系列系统组件之间的相互依赖。这些组件将依赖于同一个中介者对象。

Demo

中介接口和房产链家

    /// <summary>/// 房产中介接口/// </summary>public interface IHouseMediator {void Notify(object sneder,string ev);}/// <summary>/// 链家   房产中介。实现房产中介接口/// </summary>class LianJiaMediator :IHouseMediator{private TianJingHouse _tjHouse;private XianAnHouse _xaHouse;        public LianJiaMediator(TianJingHouse houseTj, XianAnHouse houseXa){                        this._tjHouse = houseTj;this._tjHouse.SetHouseMediator(this);this._xaHouse = houseXa;this._xaHouse.SetHouseMediator(this);}public void Notify(object sneder, string ev){if (ev == "FirstTJ"){Console.WriteLine("输出......");this._xaHouse.SecondSell();}if (ev == "SecondXA"){Console.WriteLine("输出------");this._tjHouse.SecondSell();this._xaHouse.SecondSell();}}}

房子基类和  将售卖的房子

    /// <summary>/// 房子基类/// </summary>class BaseHouse {protected IHouseMediator _houseMediator;public BaseHouse(IHouseMediator houseMediator=null){this._houseMediator = houseMediator;}public void SetHouseMediator(IHouseMediator houseMediator) {this._houseMediator = houseMediator;}}/// <summary>/// 天津的房子/// </summary>class TianJingHouse :BaseHouse{public void FirstSell() {Console.WriteLine("天津房子第一次出售");this._houseMediator.Notify(this, "FirstTJ");}public void SecondSell(){Console.WriteLine("天津房子第二次出售");this._houseMediator.Notify(this, "SecondTJ");}}/// <summary>/// 西安的房子/// </summary>class XianAnHouse : BaseHouse {public void FirstSell(){Console.WriteLine("西安房子第一次出售");this._houseMediator.Notify(this, "FirstXA");}public void SecondSell(){Console.WriteLine("西安房子第二次出售");this._houseMediator.Notify(this, "SecondXA");}}
    class Program{static void Main(string[] args){TianJingHouse tjHouse = new TianJingHouse();XianAnHouse xiHouse = new XianAnHouse();new LianJiaMediator(tjHouse, xiHouse);Console.WriteLine("客户端 执行First TJ");tjHouse.FirstSell();Console.ReadLine();Console.WriteLine("客户端 执行Second XA");xiHouse.SecondSell();Console.ReadKey();}}

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦关注、点赞、转发 谢谢。

- END -

往期推荐

设计模式总览

设计模式之简单工厂

设计模式之抽象工厂

设计模式之建造者

设计模式之原型

设计模式之单例

设计模式之适配器

设计模式之桥接

设计模式之组合

设计模式之装饰器

设计模式之外观

设计模式之享元

设计模式之代理

设计模式之责任链

设计模式之命令

设计模式之迭代器

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

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

相关文章

你的网页加载太慢了怎么办?

客户反映&#xff0c;“网页速度太慢了&#xff01;&#xff01;”&#xff0c;怎么办&#xff1f; 这个问题似乎有些难以解决&#xff0c;慢了就是慢了&#xff0c;也许用户使用就是一个56K猫&#xff0c;也许服务器只有256K的带宽&#xff0c;也许是网页设计有问题&#xff…

看了这个逻辑关系图,才更清晰为何不让你随便外出了

全世界只有3.14 % 的人关注了青少年数学之旅看了这个逻辑关系图&#xff0c;才更清晰为何不让你随便外出了。非常时期&#xff0c;爱国、爱家、爱自己&#xff0c;请近期减少不必要的外出&#xff0c;直到官方宣布疫情解除&#xff01;转载来源&#xff1a;刘小兔爱画画部分素材…

ef 关联依赖属性_基础巩固之:xmlns属性梳理

转载自&#xff1a;https://www.cnblogs.com/osttwz/p/6892999.html<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…

高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水

文章开篇问一个问题吧&#xff0c;一个java程序&#xff0c;如果其中一个线程发生了OOM&#xff0c;那进程中的其他线程还能运行吗&#xff1f; 接下来做实验&#xff0c;看看JVM的六种OOM之后程序还能不能访问。 在这里我用的是一个springboot程序。 /*** author &#xff…

架构 | 聊聊我心中的架构设计观

【架构设计】| 总结/Edison Zhou在各种面试场合&#xff0c;可能都会被问到“你对架构设计的理解”&#xff0c;我也在最近的转正答辩中被技术委员会负责人问到&#xff0c;这里我重新整理一下思绪&#xff0c;聊聊我心中的的架构设计观。1系统的本质是什么&#xff1f;作为一个…

GeneralUpdate 2021.08.14更新公告

GeneralUpdate是基于.net standard2.0开发的一款&#xff08;c/s应用&#xff09;自动升级程序。该组件将更新的核心部分抽离出来方便应用于多种项目当中目前适用于wpf&#xff0c;控制台应用&#xff0c;winfrom。1.Notice预计会使用Blazor开发GeneralUpdate官网&#xff0c;介…

这可能是这次疫情最搞笑的事情,可看着看着却鼻酸了

全世界只有3.14 % 的人关注了青少年数学之旅最近在广州地铁&#xff0c;有人戴了这种自制的硬核“面罩”&#xff01;广州地铁后来回应说&#xff0c;这些人其实也戴了口罩&#xff0c;否则光戴着桶还是不可以进地铁的目测这种“全方位防护”效果应该不错网友爆料说&#xff0c…

面试问外观模式???这不就是设计模式里面的吗?我给你上一课吧,面试官

面试问外观模式&#xff1f;&#xff1f;&#xff1f;这不就是设计模式里面的吗&#xff1f;我给你上一课吧&#xff0c;面试官外观模式介绍实现步骤 1Shape.java步骤 2Rectangle.javaSquare.javaCircle.java步骤 3ShapeMaker.java步骤 4FacadePatternDemo.java步骤 5外观模式 …

ab st语言编程手册_西门子PLC编程SCL和LAD谁才是王者?一起讨论一下

现在很多大品牌的中高级 PLC 都支持国际电工委员会 IEC61131 标准中规范的五种编程语言的混合编程&#xff0c;即梯形图&#xff08;LD&#xff09;、结构化文本(ST)、流程图&#xff08;SFC&#xff09;、指令表&#xff08;IL&#xff09;和功能块(FB)。在这五种编程语言中&a…

ASP.NET Core自定义响应内容

问题在业务开发中&#xff0c;对Web API的返回格式有一定要求&#xff0c;需要是定制化的Json结构&#xff0c;用于前端统一处理&#xff1a;{Status : 0,Message: "",Info : xxx }Status表示响应的状态码&#xff0c;0为成功&#xff1b;Message表示错误消息&#x…

这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解

▲ 点击查看从素有“计算机界诺贝奖”之称的图灵奖&#xff0c;距离现在已经走过了半个多世纪。在这50多年间&#xff0c;诞生了几十位顶尖的计算机科学家以及几十项科技成就。从智能设备到5G&#xff0c;从无人车到AI&#xff0c;在计算机的进化版图中&#xff0c;计算机从一个…

倾情研发十年记

写在亚洲研究院成立十周年、亚洲工程院成立五周年之际今天是微软亚洲研究院成立十周年的日子&#xff0c;微软亚洲工程院也刚刚度过它的五周岁生日。在这个特殊的时刻&#xff0c;回望这些年来全心投入研发的日子&#xff0c;我心中充满了自豪和对未来的期待。十年前&#xff0…

华为二面!!!被问常用API,这也太偏门了吧,我秀了一波hhhh~

华为二面!!&#xff01;被问常用API&#xff0c;这也太偏门了吧&#xff0c;我秀了一波hhhh~常用API一、API概述二、Scanner类代码三、Random类代码四、* ArrayList类**存储基本数据类型**代码五、匿名对象昨天我去了华为面试&#xff0c;问我常用API&#xff0c;我以为我被搞到…

空值为0非空为1_万达广场4周年,1降到底!0元送万张杂技团门票、人气餐饮6.8折,这波周年庆我先锁为敬...

作为向来宠你没商量的国民商场4周年店庆&#xff0c;福利当然少不了&#xff01;黄金克减zui高100元餐饮全单6.8折&#xff0c;更享折上zhe更有街舞争霸赛、王者荣耀争霸赛等精彩活动等你打卡&#xff0c;?就问你来不来&#xff1f;精品超市&#xff0c;实力宠粉没有套路&…

清北学霸的书单居然那么有讲究?看看你比学霸少看了哪些书......

一直以来&#xff0c;少年物理学家为大家分享了许多物理知识、科学家的小故事&#xff0c;以及生活中的趣味科学&#xff0c;得到了许多粉丝们的支持&#xff01;为了表达对大家的感谢&#xff0c;在新春之际&#xff0c;我们决定发起“最美学习萌娃”评选活动&#xff0c;借助…

平流式初沉池贮砂斗计算_城市污水处理厂产泥量的计算

污泥是污水处理过程的副产物&#xff0c;包括筛余物、沉泥、浮渣和剩余污泥等。污泥体积约占处理水量的0.3%~0.5%左右&#xff0c;如水进行深度处理&#xff0c;污泥量还可能增加0.5~1倍。一、污水处理污泥分类及特性1、按成分不同分污泥&#xff1a;以有机物为主要成分。其主要…

从N个元素中选择第i小的元素

时常在笔试,面试题中看到这个问题,《算法导论》中给出了很好的解答。 Selection of the ith smallest element of the array A can be done in θ(n) times. The psuedocode is following: CodeRandomized_Select(A,p,r,i){ if pr then return A[p] qRandomized_…

Blazor 模板化组件开发指南

翻译自 Waqas Anwar 2021年4月15日的文章 《A Developer’s Guide To Blazor Templated Components》 [1]在我之前的一篇文章 Blazor 组件入门指南中&#xff0c;我介绍了组件参数&#xff0c;并向您展示了如何将数据作为参数传递给 Blazor 组件以定制化其功能。在这篇文章中&a…

别太贪婪,这些技能能让你一辈子满足

全世界只有3.14 % 的人关注了青少年数学之旅在这个资讯丰富且易获取的时代&#xff0c;越来越多的人不愿意花时间阅读书籍&#xff0c;碎片化阅读成了主流。人们获取的东西多而杂&#xff0c;很难系统、全面。海量信息对人是冲击&#xff0c;更是诱惑。谁不想了解天下奇闻&…

纳尼???我JVM优化过头了,直接把异常信息优化没了?怎么办

你好呀&#xff0c;我是why。 你猜这次我又要写个啥没有卵用的知识点呢&#xff1f; 不好意思&#xff0c;问的稍微有点早了&#xff0c;啥提示都没给&#xff0c;咋猜呢&#xff0c;对吧&#xff1f; 先给你上个代码&#xff1a; public class ExceptionTest {public stati…