中介者模式是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系,该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。
中介者模式顾名思义,可以用我们平时生活中的房产中介去理解。房产中介就是房子拥有者和想买房子人直接的桥梁,不让二者直接交易,通过中介去做桥梁,进行沟通和交易。
中介者模式建议你停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象,通过中介者对象重定向调用行为,以间接的方式进行合作。最终,组件仅依赖于一个中介者类,无需与多个组件想耦合。
类所拥有的依赖关系越少,就越易于修改、扩展或复用。
可以为所有类型的对话框抽取通用接口,进一步消弱其依赖性;接口中将声明一个所有表单元素都能使用的通知方法,可用于将元素中发生的事件通知给对话框,所有实现了该接口的对话框都能使用这个提交按钮。
是包含业务逻辑的类。每一个组件都有一个指向中介者的引用,该引用被声明为中介者接口类型。组件并不知道中介者所属的类,这样就可通过将其连接到不同的中介者使其能在其他程序中复用。
声明了与组件交流的方法,但通常仅包括一个通知方法。组件可将任意上下文(自身)作为该方法的参数,只有这样接收组件和发送者类之间才不会耦合。
封装了多种组件间的关系。具体中介者通常会保存所有组件的引用并对其进行管理,甚至有时会对其生命周期进行管理。
组件并不知道其他组件的情况。如果组件内发生了重要事情,它只能通知中介者。中介者收到消息后能轻易地确定发送者,者或许已足以去判断接下来需要触发的组件。
对于组件来说,中介者其实就是一个黑箱。发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初的谁发出了请求。
满足单一职责、开闭原则、减轻应用中多个组件间的耦合情况、方便复用各个组件。
中介者将系统中组件的沟通行为中心化。各组件只知道中介者对象,无法直接相互交流。
中介者的主要目标时消除一系列系统组件之间的相互依赖。这些组件将依赖于同一个中介者对象。
中介接口和房产链家
/// <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(); } }
人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。
原创不易,给个关注。
我是阿辉,感谢您的阅读,如果对你有帮助,麻烦关注、点赞、转发 谢谢。