MaoBisheng

Asp.Net(C#) & SQL & Oracle

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

16. Mediator 中介者模式           2008-09-09

动机(Motivation)

在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。

在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

意图(Intent)

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

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

 

基本代码:
    //抽象中介者,定义了同事对象到中介者对象的接口
    abstract class Mediator
    {
        
public abstract void Send(string message, Colleague colleague);
    }
 
//具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发出命令
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);
        }
    }
}
 
    //抽象同事类
    abstract class Colleague
    {
        
protected Mediator mediator;

        
public Colleague(Mediator mediator)
        {
            
this.mediator = mediator;
        }
    }
 
//具体同事类1,具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象
class ConcreteColleague1 : Colleague
{
    
public ConcreteColleague1(Mediator mediator)
        : 
base(mediator)
    {

    }

    
public void Send(string message)
    {
        mediator.Send(message, 
this);
    }

    
public void Notify(string message)
    {
        Console.WriteLine(
"同事1得到信息:" + message);
    }
}
 
//具体同事类2,具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象
class ConcreteColleague2 : Colleague
{
    
public ConcreteColleague2(Mediator mediator)
        : 
base(mediator)
    {
    }

    
public void Send(string message)
    {
        mediator.Send(message, 
this);
    }

    
public void Notify(string message)
    {
        Console.WriteLine(
"同事2得到信息:" + message);
    }
}
 
客户端代码:
    class Program
    {
        
static void Main(string[] args)
        {
            ConcreteMediator m 
= new ConcreteMediator();

            ConcreteColleague1 c1 
= new ConcreteColleague1(m);
            ConcreteColleague2 c2 
= new ConcreteColleague2(m);

            m.Colleague1 
= c1;
            m.Colleague2 
= c2;

            c1.Send(
"吃过饭了吗?");
            c2.Send(
"没有呢,你打算请客?");

            Console.Read();
        }
    }
 

Mediator的几个要点:

将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

Façade模式是解耦系统外到系统内(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。

  
 
posted on 2008-09-10 18:35  MaoBisheng  阅读(398)  评论(0编辑  收藏  举报