设计模式之中介者

中介者模式介绍

中介者模式

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

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

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

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

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

中介者模式结构

  • 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,一经查实,立即删除!

相关文章

2010 本年度认证目标:坐沙发的熊

2月.wcf-------哎2月份没搞定啊。 3月.winform------3月份还有时间&#xff0c;不能被无数的破事儿占了&#xff01; 4月.web 3.5 5月.wpf转载于:https://www.cnblogs.com/zhuispeed/archive/2010/02/01/1660862.html

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

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

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

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

xen虚拟机管理xm的用法

目的&#xff1a;通过xm命令方便管理xen虚拟机。命令列表&#xff1a;xm list&#xff1a;所有已知的虚拟机列表 xm create&#xff1a;启动一个非托管的虚拟机 xm top&#xff1a;提供所有虚拟机的状态概貌 xm console&#xff1a;打开控制台管理虚拟机 xm new&#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外观模式 …

[转]IIS的完整控制类

using System;using System.Data;using System.DirectoryServices;using System.Collections; namespace CreateWebDir{ /// <summary> // IISManager 的摘要说明。 /// </summary>public class IISManager{ //定义需要使用的 private st…

让Windows XP系统快上几倍的三个绝招

让Windows XP系统快上几倍的三个绝招1、减少开机磁盘扫描等待时间&#xff0c;开始→运行&#xff0c;键入chkntfs /t:0 2、删除系统备份文件&#xff1a;在各种软硬件安装妥当之后&#xff0c;其实XP需要更新文件的时候就很少了。 开始→运行&#xff0c;敲入&#xff1a;sfc.…

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

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

获取本地IP和mac等信息

1获取mac protected string getHostMacName() { string mac ""; ManagementClass mc; mc new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc mc.GetInstances(); foreach (ManagementObject mo in moc) { if …

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;现在QQ.com也是我认为门户里做得最好的了。看了一下今天的话题《蚁族之痛&#xff1a;春节恐归症》&#xff0c;感觉说得很对&#xff0c;说出了我们这代人的心声。以前听大人们讲年关的来头&#xff1a;说是农民最怕的就…

倾情研发十年记

写在亚洲研究院成立十周年、亚洲工程院成立五周年之际今天是微软亚洲研究院成立十周年的日子&#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;实力宠粉没有套路&…