zoukankan      html  css  js  c++  java
  • 设计模式之美:Mediator(中介者)

    索引

    意图

    用一个中介对象来封装一系列的对象交互。

    中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

    Define an object that encapsulates how a set of objects interact.

    Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.

    结构

    一个典型的对象结构:

    参与者

    Mediator

    • 中介者定义一个接口用于与各同事对象通信。

    ConcreteMediator

    • 具体中介者通过协调各同事对象实现协作行为。
    • 了解并维护它的各个同事。

    Colleague

    • 每一个同事类都知道它的中介者。
    • 每一个同事对象在需与其他同事通信时,与它的中介者通信。

    适用性

    在以下情况下可以使用 Mediator 模式:

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

    效果

    • 减少了子类的生成。
    • 将各个同事类解耦。
    • 它简化了对象协议。
    • 它对对象如何协作进行了抽象。
    • 它使控制集中化。

    相关模式

    • Facade 模式与 Mediator 模式的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即 Facade 对象对这个子系统类提出要求,但反之则不行。Mediator 提供了各 Colleague 对象不支持或不能支持的协作行为,而协议是多向的。
    • Colleague 可以使用 Observer 模式与 Mediator 通信。

    实现

    实现方式(一):Mediator 模式结构样式代码。

     Colleague-Mediator 的通信中,当一个感兴趣的事件发生时,Colleague 必须与其 Mediator 通信。

    一种方式是使用 Observer 模式,将 Mediator 实现为一个 Observer,各 Colleague 作为 Subject。

    另一种方式是在 Mediator 中定义一个特殊的通知接口,各 Colleague 在通信时直接调用该接口。

      1 namespace MediatorPattern.Implementation1
      2 {
      3   public abstract class Colleague
      4   {
      5     protected Mediator _mediator;
      6 
      7     public Colleague(Mediator mediator)
      8     {
      9       _mediator = mediator;
     10     }
     11 
     12     public abstract void Send(string message);
     13     public abstract void Notify(string message);
     14   }
     15 
     16   public abstract class Mediator
     17   {
     18     public abstract void SendMessage(Colleague sender, string message);
     19   }
     20 
     21   public class ConcreteMediator : Mediator
     22   {
     23     private ConcreteColleague1 _colleague1;
     24     private ConcreteColleague2 _colleague2;
     25 
     26     public ConcreteColleague1 Colleague1
     27     {
     28       set { _colleague1 = value; }
     29     }
     30 
     31     public ConcreteColleague2 Colleague2
     32     {
     33       set { _colleague2 = value; }
     34     }
     35 
     36     public override void SendMessage(Colleague sender, string message)
     37     {
     38       if (sender == _colleague1)
     39       {
     40         _colleague2.Notify(message);
     41       }
     42       else if (sender == _colleague2)
     43       {
     44         _colleague1.Notify(message);
     45       }
     46     }
     47   }
     48 
     49   public class ConcreteColleague1 : Colleague
     50   {
     51     public ConcreteColleague1(Mediator mediator)
     52       : base(mediator)
     53     {
     54     }
     55 
     56     public override void Send(string message)
     57     {
     58       _mediator.SendMessage(this, message);
     59     }
     60 
     61     public override void Notify(string message)
     62     {
     63       Console.WriteLine("Colleague1 gets message: " + message);
     64     }
     65   }
     66 
     67   public class ConcreteColleague2 : Colleague
     68   {
     69     public ConcreteColleague2(Mediator mediator)
     70       : base(mediator)
     71     {
     72     }
     73 
     74     public override void Send(string message)
     75     {
     76       _mediator.SendMessage(this, message);
     77     }
     78 
     79     public override void Notify(string message)
     80     {
     81       Console.WriteLine("Colleague2 gets message: " + message);
     82     }
     83   }
     84 
     85   public class Client
     86   {
     87     public void TestCase1()
     88     {
     89       var mediator = new ConcreteMediator();
     90 
     91       var colleague1 = new ConcreteColleague1(mediator);
     92       var colleague2 = new ConcreteColleague2(mediator);
     93 
     94       mediator.Colleague1 = colleague1;
     95       mediator.Colleague2 = colleague2;
     96 
     97       colleague1.Send("How are you?");
     98       colleague2.Send("Fine, Thank you!");
     99     }
    100   }
    101 }

    设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

  • 相关阅读:
    Exp9 Web安全基础
    EXP8 Web基础
    Exp7 网络欺诈防范
    Exp6 信息搜集与漏洞扫描
    Exp5 MSF基础应用
    Exp4 恶意代码分析
    Exp3 免杀原理与实践
    Exp2 后门原理与实践 20154317
    正则表达Regex替换标签
    正则表达式
  • 原文地址:https://www.cnblogs.com/gaochundong/p/design_pattern_mediator.html
Copyright © 2011-2022 走看看