在很多情况下对象之间的交互是很复杂的,在开始设计的时候,你根本不知道它需要交互的对象是谁,是什么类型。我们知道如果要对象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界面。
比较:
中介者模式与门面模式虽然有类似的功能,但两者之间的区别还是很大的,门面模式时为用户使用一系列的对象提供一个简化的接口,更多体现的是一种“代理”而不是“中介”;而中介者模式主要是为一系列的对象提供一个交互的场所,中介者对象封装了一系列对象之间的交互,中介者模式中没有用户的角色概念,也不向外提供服务。
分享到:
相关推荐
设计模式专题之(十七)中介者模式--设计模式中介者模式示例代码(python--c++)
设计模式 - 中介者模式
JAVA-设计模式-行为型模式-中介者模式
PPT内容包括:内附代码,实例,方便理解。...设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
设计模式-中介者模式(讲解及其实现代码)
c++设计模式-行为型模式-中介者模式;qt工程;c++简单源码; 中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
java常用设计模式-中介者模式
设计模式之中介者模式java代码实现 设计模式之中介者模式
Mediator 中介者模式 若有问题,烦请指出。
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
C#设计模式之中介者模式小例子
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
从实际例子说明中介者模式,进而引出中介者模式的原理,使用情况和特点等
c#设计模式之中介者,很好的。c#设计模式之中介者
Java设计模式之中介者模式__动力节点共6页.pdf.zip
看看设计模式,对以后的编程有很大的影响哦!~~
创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: ...设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
【例4.10】中介者模式-旅游信息共享 【例4.11】中介者模式-海岛机场 【例4.13】策略模式-整数排序 【例4.14】策略模式-中国属相 【例4.16】状态模式-交通信号灯-设计1 【例4.16】状态模式-交通灯...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...