设计模式笔记(二十一) —— 中介者模式

中介者模式(Mediator):用一个中介者对象来封装一系列的对象交互。中介者对象使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
      优点:Mediator的出现减少了各个Colleague的耦合,便使得可以独立的改变和复用各个Colleague和Mediator,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
      使用场合:中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在各个类中的行为,而又不想生成太多的子类的场合。

 

  1. using System;
  2. using System.Collections.Generic;
  3. /**概述
  4.  * 中介者模式(Mediator):用一个中介者对象来封装一系列的对象交互。中介者对象使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
  5.  * 优点:Mediator的出现减少了各个Colleague的耦合,便使得可以独立的改变和复用各个Colleague和Mediator,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
  6.  * 使用场合:中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在各个类中的行为,而又不想生成太多的子类的场合。
  7.  */
  8. namespace StuDesignMode.Mediator
  9. {
  10.     interface IMediator
  11.     {
  12.         void Send(string message,AbsColleague colleague);
  13.     }
  14.     abstract class AbsColleague
  15.     {
  16.         protected IMediator Mediator { getset; }
  17.         public AbsColleague(IMediator mediator)
  18.         {
  19.             this.Mediator = mediator;
  20.         }
  21.     }
  22.     class ConcreteMediator : IMediator
  23.     {
  24.         private ConcreteColleague1 _colleague1;
  25.         private ConcreteColleague2 _colleague2;
  26.         public ConcreteColleague1 Colleague1 { set { this._colleague1 = value; } }
  27.         public ConcreteColleague2 Colleague2 { set { this._colleague2 = value; } }
  28.         public void Send(string message, AbsColleague colleague)
  29.         {
  30.             if (colleague == _colleague1)
  31.             {
  32.                 _colleague2.Notify(message);
  33.             }
  34.             else if (colleague == _colleague2)
  35.             {
  36.                 _colleague1.Notify(message);
  37.             }
  38.         }
  39.     }
  40.     class ConcreteColleague1 : AbsColleague
  41.     {
  42.         public ConcreteColleague1(IMediator mediator) : base(mediator) { }
  43.         public void Send(string message)
  44.         {
  45.             this.Mediator.Send(message,this);
  46.         }
  47.         public void Notify(string message)
  48.         {
  49.             Console.WriteLine("同事一得到消息:{0}",message);
  50.         }
  51.     }
  52.     class ConcreteColleague2 : AbsColleague
  53.     {
  54.         public ConcreteColleague2(IMediator mediator) : base(mediator) { }
  55.         public void Send(string message)
  56.         {
  57.             this.Mediator.Send(message, this);
  58.         }
  59.         public void Notify(string message)
  60.         {
  61.             Console.WriteLine("同事二得到消息:{0}",message);
  62.         }
  63.     }
  64.     class ClientTest
  65.     {
  66.         static void Main(string[] args)
  67.         {
  68.             ConcreteMediator mediator = new ConcreteMediator();
  69.             ConcreteColleague1 coll1 = new ConcreteColleague1(mediator);
  70.             ConcreteColleague2 coll2 = new ConcreteColleague2(mediator);
  71.             mediator.Colleague1 = coll1;
  72.             mediator.Colleague2 = coll2;
  73.             coll1.Send("吃饭了么?");
  74.             coll2.Send("还没呢,你呢?");
  75.         }
  76.     }
  77. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值