设计模式之中介者

简介: 设计模式之中介者

中介者模式介绍



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


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



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



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

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



中介者模式结构


  • 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();
        }
    }
目录
相关文章
|
Android开发 设计模式
设计模式 -- 中介者设计模式 (Mediator Pattern)
中介者模式的定义:将多对多关系分散为一对多的关系,将网状结构变成星状结构,降低复杂度,提高扩展性。 角色: Mediator :抽象中介者角色,以抽象类的方式实现,生命具体对象,以及抽象方法; ConcreteMediator:具体中介者角色,实现中介者抽象类Mediator,实现具体对象的业务操作; Colleague:具体对象的抽象类,定义对象的具体行为抽象方法; ConcreteColleague A/B:具体同事类角色,继承自Colleague,都只知道自身范围内的行为。
664 0
【HeadFirst 设计模式学习笔记】17 中介者(Mediator)模式拾零
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.概述 该模式在Head First中没有介绍,它用于通过一个中介者完成对象间通信的解耦。当代码中出现大量有着其他对象信息的对象时就可以使用这个模式。
810 0
|
22天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
25天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
18天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
37 1
|
1月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
22 3