Chinaunix首页 | 论坛 | 博客
  • 博客访问: 664609
  • 博文数量: 220
  • 博客积分: 10487
  • 博客等级: 上将
  • 技术积分: 2072
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-09 00:25
文章分类

全部博文(220)

文章存档

2012年(5)

2011年(38)

2010年(135)

2009年(42)

我的朋友

分类:

2009-10-18 01:02:52

定义

定义一个对象,封装对象集之间的交互。该模式通过阻止对象间显示引用从而减少对象间的耦合,同时它允许独立的改变他们之间的交互。

使用频度: 中低



UML 类图




参与者

该模式参与的类或对象

  • Mediator(调停者)
    • 定义(Colleague)同事间通信的接口
  • ConcteteMediator(具体调停者)
    • 通过具体的协调对象实现协调操作
    • 维护要协调的同事对象
  • Colleague class(同事类)
    • 每个同事类知道其调停者
    • 在需要与其他同事通信时,不管什么时候,每个同事均与其调停者通信


C# 示例代码


// Mediator pattern -- Structural example


using System;

 

namespace DoFactory.GangOfFour.Mediator.Structural

{

  ///




  /// MainApp startup class for Structural


  /// Mediator Design Pattern.


  ///



  class MainApp

  {

    ///


    /// Entry point into console application.


    ///



    static void Main()

    {

      ConcreteMediator m = new ConcreteMediator();

 

      ConcreteColleague1 c1 = new ConcreteColleague1(m);

      ConcreteColleague2 c2 = new ConcreteColleague2(m);

 

      m.Colleague1 = c1;

      m.Colleague2 = c2;

 

      c1.Send("How are you?");

      c2.Send("Fine, thanks");

 

      // Wait for user


      Console.ReadKey();

    }

  }

 

  ///


  /// The 'Mediator' abstract class


  ///



  abstract class Mediator

  {

    public abstract void Send(string message,

      Colleague colleague);

  }

 

  ///


  /// The 'ConcreteMediator' class


  ///



  class ConcreteMediator : Mediator

  {

    private ConcreteColleague1 _colleague1;

    private ConcreteColleague2 _colleague2;

 

    public ConcreteColleague1 Colleague1

    {

      set { _colleague1 = value; }

    }

 

    public ConcreteColleague2 Colleague2

    {

      set { _colleague2 = value; }

    }

 

    public override void Send(string message,

      Colleague colleague)

    {

      if (colleague == _colleague1)

      {

        _colleague2.Notify(message);

      }

      else

      {

        _colleague1.Notify(message);

      }

    }

  }

 

  ///


  /// The 'Colleague' abstract class


  ///



  abstract class Colleague

  {

    protected Mediator mediator;

 

    // Constructor


    public Colleague(Mediator mediator)

    {

      this.mediator = mediator;

    }

  }

 

  ///


  /// A 'ConcreteColleague' class


  ///



  class ConcreteColleague1 : Colleague

  {

    // Constructor


    public ConcreteColleague1(Mediator mediator)

      : base(mediator)

    {

    }

 

    public void Send(string message)

    {

      mediator.Send(message, this);

    }

 

    public void Notify(string message)

    {

      Console.WriteLine("Colleague1 gets message: "

        + message);

    }

  }

 

  ///


  /// A 'ConcreteColleague' class


  ///



  class ConcreteColleague2 : Colleague

  {

    // Constructor


    public ConcreteColleague2(Mediator mediator)

      : base(mediator)

    {

    }

 

    public void Send(string message)

    {

      mediator.Send(message, this);

    }

 

    public void Notify(string message)

    {

      Console.WriteLine("Colleague2 gets message: "

        + message);

    }

  }

}


输出

Colleague2 gets message: How are you?
Colleague1 gets message: Fine, thanks


阅读(492) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~