zoukankan      html  css  js  c++  java
  • 设计模式之中介者

    中介者模式介绍

    中介者模式

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

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

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

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

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

    中介者模式结构

    • 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();
            }
        }
    

    小寄语

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

    原创不易,给个关注。

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

    作者:阿辉
    关注我:微信扫描下面二维码,6T编程资料免费送。
    微信公众号:Andy阿辉
    写一些程序员的所思所想,希望对你有帮助。

    版权声明:本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    cf------(round)#1 C. Ancient Berland Circus(几何)
    cf------(round)#1 B. Spreadsheets(模拟)
    grep 精确匹配
    解决 service iptables save 报错 please try to use systemctl
    kubernetes 亲和性调度详解
    免费好用的SSH手机客户端
    axios和drf结合的增删改查
    CDH 部署 Hadoop:5.开始安装
    OpenNebula概述
    Python 3.x 引入了函数注释
  • 原文地址:https://www.cnblogs.com/netxiaohui/p/15168539.html
Copyright © 2011-2022 走看看