`
iwebcode
  • 浏览: 2009389 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

设计模式之--中介者模式

 
阅读更多

在很多情况下对象之间的交互是很复杂的,在开始设计的时候,你根本不知道它需要交互的对象是谁,是什么类型。我们知道如果要对象A与对象B之间能相互交互,A与B就会构成相互依赖,如果对象一多,这种依赖就会很复杂,况且很多时候我们都不知道需要互相交互的对象有哪些,因此,在设计的时候也没办法考虑这些情况。既然在设计的时候无法预先知道对象之间的交互具体情况,我们可以将这种交互放到一个“中间平台”进行,这个中间平台知道所有对象的(依赖于所有对象,但对象是否必须依赖于平台不是必须的),这样就将对象之间的依赖简化成对象与“平台”之间的依赖,因而会大大降低对象之间的复杂度。当然,对象在平台能够进行交互,必须遵守一定的协议,而且这个平台需要知道所有对象的细节。(这在开发实现时其实算不上什么条件,比如Delphi和C#,Java所有的类都有一个共同的基类,因此不需要额外的为这些交互的对象定义一个抽象的接口之类的)。这种平台起到的作用就是一种中介的作用。

《设计模式》疑问对中介模式的定义:用一个中介对象来封装一系列的对象(同事对象)交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介模式有三个角色:一个是抽象同事,这个角色的定义纯粹是为了使得中介者在定义交互方法的参数时能形式统一,不依赖于具体的同事(一般情况下不需要定义这个抽象类,因为常见的开发语言都有一个基本的类类型(如Delphi,C#的Object类)),二是具体同事类(要交互的对象,可以是已有的,现定义的等),三是中介。下面是中介模式的简图:

示例:

public struct Mediator_Param
{
public string Name;
public string Value;
}
/// <summary>
/// Mediator 的摘要说明。
/// </summary>
public abstract class Mediator_Mediator
{
//定义中介者的其它共同属性
//下面的属性一般用事件处理,比较好
public abstract void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param);
public abstract void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param);
}
public class Mediator_ConcreateMediator : Mediator_Mediator
{
private Mediator_ConcreateColleagueA concreateColleagueA;
private Mediator_ConcreateColleagueB concreateColleagueB;
public override void ConcreateColleagueADataChange(Mediator_Colleague sender, Mediator_Param Param)
{
if(Param.Name=="tian")
concreateColleagueB.ShowValue(Param.Value);
}
public override void ConcreateColleagueBDataChange(Mediator_Colleague sender, Mediator_Param Param)
{
concreateColleagueB.ShowValue(Param.Name+" "+Param.Value);
}
public void IntroduceConcreateMediator(Mediator_ConcreateColleagueA concreateColleagueA,Mediator_ConcreateColleagueB concreateColleagueB)
{
this.concreateColleagueA = concreateColleagueA;
this.concreateColleagueB = concreateColleagueB;
}
public Mediator_ConcreateMediator()
{
}
}
public abstract class Mediator_Colleague
{

}
public class Mediator_ConcreateColleagueA : Mediator_Colleague
{
private Mediator_Mediator mediator;
public Mediator_ConcreateColleagueA(Mediator_Mediator mediator)
{
this.mediator = mediator;
}
public void DataChanged()
{
if(mediator!=null)
{
Mediator_Param param;
param.Name = "tian";
param.Value="121212";
mediator.ConcreateColleagueADataChange(this,param);
}
}
}
public class Mediator_ConcreateColleagueB : Mediator_Colleague
{
private Mediator_Mediator mediator;
public Mediator_ConcreateColleagueB(Mediator_Mediator mediator)
{
this.mediator = mediator;
}
public void DataChanged()
{
if(mediator!=null)
{
Mediator_Param param;
param.Name = "zhang";
param.Value="888888";
mediator.ConcreateColleagueBDataChange(this,param);
}
}
public void ShowValue(string Value)
{
System.Windows.Forms.MessageBox.Show(Value);
}
}
public class Mediator_Client
{
public static void Test()
{
Mediator_ConcreateMediator mediator = new Mediator_ConcreateMediator();
Mediator_ConcreateColleagueA mcA= new Mediator_ConcreateColleagueA(mediator);
Mediator_ConcreateColleagueB mcB= new Mediator_ConcreateColleagueB(mediator);
mediator.IntroduceConcreateMediator(mcA,mcB);
mcA.DataChanged();
mcB.DataChanged();
}
}

中介模式的优点:

减少子类生成;将同事类解耦;简化了对象之间的协议;对对象如何协作进行了抽象;使控制集中化;

中介模式的实现改进:

1)由于一般开发语言都有一个基本父类,因此如果采用这个基本的类作为抽象同事,则在实现时不需要显示定义。

2)采用事件或者消来进行对象之间的交互,则可以使得同事对象不依赖于中介,进一步解耦中介与对象之间的关系。

典型应用场景:

1)现实生活中的各种交互平台(比如交易所,超市,集市,购物广场,交易会,网络论坛等),特别注意,现实中的很多中介公司(比如留学服务中介等)的中介含义还是与中介模式中的中介含义不太一样,它们除了体现一种“中介”外,还有“代理”的味道在里面。中介模式中的中介其实仅提供一个交互的平台,具体的交互还是对象之间来完成的

2)开发系统中的用户UI界面。

比较:

中介者模式与门面模式虽然有类似的功能,但两者之间的区别还是很大的,门面模式时为用户使用一系列的对象提供一个简化的接口,更多体现的是一种“代理”而不是“中介”;而中介者模式主要是为一系列的对象提供一个交互的场所,中介者对象封装了一系列对象之间的交互,中介者模式中没有用户的角色概念,也不向外提供服务。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics