设计模式C#实现(十六)——中介者模式

    • 意图
      0
    • 适用性
      1
    • 结构
      2
    • 实现
      3
    • 效果
      4
    • 参考
      5

意图

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

适用性

  • 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且之间
  • 想定制一个分布在多个类中的行为,而又不想生成太多子类。

结构

实现

在未来的智能家居中,家里的各种电器相互关联,假设这样三种电器:闹钟,日历和咖啡壶。现在有这样两个任务:

  1. 当按下闹钟的“延迟”按钮(过5分钟后再次响铃)后,日历检查今天是否是星期日,如果不是,则咖啡壶开始准备咖啡。
  2. 当关闭日历,咖啡壶和闹钟也一同关闭。

同事类,每一个同事都知道他的中介者,当它需要与其他同事交流时,它只需通知中介者。

public abstract class Colleague
    {
        protected string _type;
        protected Mediator _theMediator;
        public string Type
        {
            get { return _type; }
        }
        public Mediator TheMediator
        {
            get { return _theMediator; }
            set { _theMediator = value; }
        }
    }

具体同事

  public class Alarm : Colleague
    {
        public Alarm()
        {
            _type = "Alarm";
        }
        public void AlarmLater()
        {
            Console.WriteLine("Alarm 5min later");
            _theMediator.Notify(this);
        }
        public void PowerOff()
        {
            Console.WriteLine("Alarm PowerOff");
        }
    }
    public class CoffeePot : Colleague
    {
        public CoffeePot()
        {
            _type = "CoffeePot";
        }
        public void PrepareCoffee()
        {
            Console.WriteLine("Start preparing coffee");
        }
        public   void PowerOff()
        {
            Console.WriteLine("CoffeePot PowerOff");
        }
    }
     public class Calendar : Colleague
    {
        public Calendar()
        {
            _type = "Calendar";
        }
        public DayOfWeek GetDayOfWeek()
        {
            return DateTime.Today.DayOfWeek;
        }
        public  void PowerOff()
        {
            Console.WriteLine("Calendar PowerOff");
            _theMediator.Notify(this);
        }
    }

中介者定义一个用于与各同事通信的接口

  public  class Mediator
    {
        public virtual void Notify(Colleague colleague)
        {
        }
    }

具体中介者了解和维护各个同事,并协调各同事以实现协作行为。

 public class FutureHouse : Mediator
    {
        private Alarm _alarm;
        private CoffeePot _coffeePot;
        private Calendar _calendar;
        public Calendar HouseCalendar
        {
            get { return _calendar; }
            set { _calendar = value; }
        }
        public CoffeePot HouseCoffeePot
        {
            get { return _coffeePot; }
            set { _coffeePot = value; }
        }
        public Alarm HouseAlarm
        {
            get { return _alarm; }
            set { _alarm = value; }
        }
        private void WeekUp()
        {
            if (HouseCalendar.GetDayOfWeek()!=DayOfWeek.Sunday)
            {
                HouseCoffeePot.PrepareCoffee();
            }
        }
        private void PowerOff()
        {
            HouseCoffeePot.PowerOff();
            HouseAlarm.PowerOff();
        }
        public override void Notify(Colleague colleague)
        {
            if (colleague.Type == "Alarm")
            {
                WeekUp();
            }
            else if (colleague.Type == "Calendar")
            {
                PowerOff();
            }
        }
    }

使用

class Program
    {
        static void Main(string[] args)
        {
            var calendar = new Calendar();
            var coffeePot = new CoffeePot();
            var alarm = new Alarm();
            var house = new FutureHouse();
            calendar.TheMediator = house;
            alarm.TheMediator = house;
            coffeePot.TheMediator = house;

            house.HouseCalendar = calendar;
            house.HouseAlarm = alarm;
            house.HouseCoffeePot = coffeePot;

            alarm.AlarmLater();

            calendar.PowerOff();

            Console.ReadKey();
        }
    }

运行结果

  • 周日
  • 非周日

效果

  1. 减少了子类
  2. 将各Colleague解耦
  3. 简化了对象协议,使用Mediator和各Colleague间的一对多交互替代多对多交互
  4. 它对对象如何进行协助进行了抽象
  5. 使控制集中化
  6. 中介者可能变得庞大而且复杂,难以维护

参考

  1. 《Head First 设计模式》
  2. 《设计模式》
时间: 2024-10-11 06:13:28

设计模式C#实现(十六)——中介者模式的相关文章

javascript设计模式学习之十五——中介者模式

一.中介者模式的定义和应用场景 中介者模式的作用在于解除对象之间的紧耦合关系,增加一个中介者之后,所有对象都通过中介者来通信,而不是互相引用,当一个对象发生变化的时候,仅需要通知中介者即可.从而将网状的多对多关系转换为了简单的一对多关系. 二.

设计模式学习(十六) 模板方法模式

场景: -- 客户到银行办理业务 1:取号排队 2:办理具体现金/转账/企业/个人/理财业务 3: 给银行工作人员评分 模板方法介绍; -- 模板方法模式是编程中经常用到的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤 核心: -- 处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定.因此,我们采用模板方法模式.将这个节点的代码实现转移给子类完成.即:处理步骤父类中定义好,具体实现延迟到子类

设计模式C++实现十六:迭代器模式

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 使用场景:当我们需要访问一个聚集对象时,而且不管这些对象是什么都需要遍历的时候,我们可以考虑使用迭代器模式.如果我们需要对聚集有多种方式遍历时,也可以考虑使用迭代器模式.迭代器一般需要提供开始,下一个,是否结束,当前项的内容等方法. #ifndef ITERATOR_H #define ITERATOR_H #include<iostream> #include<string>

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

Java 设计模式系列(十六)观察者模式(Observer)

Java 设计模式系列(十六)观察者模式(Observer) 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 一.观察者模式的结构 Subject:目标对象,通常具有如下功能:

设计模式之第19章-中介者模式(Java实现)

设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复杂起来了,这个时候如果有中介者进行中转,类似于星型网络拓扑的交换机,那么该有多好.(PS:注孤生啊,和测试妹纸.美工妹纸什么的一起讨论增进感情多好,那么好的机会都不珍惜.编者按:我是要做那个中介者,懂么?中介者!众人:good job!)“鱼哥,叫我干嘛?”真是说曹操曹操到,刚刚正说你来着,行了,你

Java设计模式菜鸟系列(二十二)中介者模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40027109 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改. 一.uml建模: 二.代码实现 /** * 中介者模式(Mediator):主要用来降低类与类之间的耦合的,因为如果类与类之间有依赖关系的话, * * 不利于功能的拓展和维护,因为只要修改一个对象,其它

设计模式(五):中介者模式

在<JavaScript设计模式>关于中介者模式的介绍里,里面有些错误和擅自添加的例子,虽然例子(英文版没有)是为了让人更好理解,但是该篇章加上的例子却给人误导的感觉,所以如果有人读这个章节时,建议看英文版. 在看这个模式时候,我只想弄明白一点,中介者模式与订阅/发布模式的区别在哪? 中介者模式定义 中介者作为一种行为设计模式,它公开一个统一的接口,系统的不同对象或组件可以通过该接口进行通信.增加一个中介者对象后,所有的相关对象通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只

&quot;围观&quot;设计模式(25)--行为型之中介者模式(Mediator Pattern)

用一个对象封装一系列的对象交互,中介者使对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的独立. 个人理解 当多个对象之间存在着过多的耦合时,可以通过中介者模式进行解耦,将具体的对象之间的耦合转为中介者与具体对象的耦合,假如说之前是三个对象的相互之间的耦合,转为中介者与具体类的耦合之后,从耦合性上大大的降低了,这样如果再来对其进行修改的话,那么变更部分主要在中介者部分,从而使得该结构更加稳定. 角色分析 中介者角色分以下几个部分: 1. Mediator抽象中介者角色:抽象

设计模式@第21章:中介者模式

第21章:中介者模式 一.智能家庭项目 智能家庭项目: 智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘 等 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放 二.传统方案解决智能家庭管理问题 三.传统的方式的问题分析 当各电器对象有多种状态改变时,相互之间的调用关系会比较复杂 各个电器对象彼此联系,你中有我,我中有你,不利于松耦合. 各个电器对象之间所传递的消息(参数),容易混乱 当系统增加一个新