一、产生背景

从生活中的例子可以看出,不论是QQ游戏还是QQ群,它们都是充当一个中间平台,QQ用户可以登录这个中间平台与其他QQ用户进行交流,如果没有这些中间平台,我们如果想与朋友进行聊天的话,可能就需要当面才可以了。电话、短信也同样是一个中间平台,有了这个中间平台,每个用户都不要直接依赖与其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。了解完中介模式在生活中的模型后,下面给出中介模式的正式定义。

中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。

二、实现方式

从生活中例子自然知道,中介者模式设计两个具体对象,一个是用户类,另一个是中介者类,根据针对接口编程原则,则需要把这两类角色进行抽象,所以中介者模式中就有了4类角色,它们分别是:抽象中介者角色,具体中介者角色、抽象同事类和具体同事类。中介者类是起到协调各个对象的作用,则抽象中介者角色中则需要保存各个对象的引用。

三、实例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace MediatorPattern
{
class Program
{
static void Main(string[] args)
{
AbstractCardPartner A = new ParterA();
AbstractCardPartner B = new ParterB();
// 初始钱
A.MoneyCount = ;
B.MoneyCount = ; AbstractMediator mediator = new MediatorPater(A, B); // A赢了
A.ChangeCount(, mediator);
Console.WriteLine("A 现在的钱是:{0}", A.MoneyCount);// 应该是25
Console.WriteLine("B 现在的钱是:{0}", B.MoneyCount); // 应该是15 // B 赢了
B.ChangeCount(, mediator);
Console.WriteLine("A 现在的钱是:{0}", A.MoneyCount);// 应该是15
Console.WriteLine("B 现在的钱是:{0}", B.MoneyCount); // 应该是25
Console.Read(); }
} // 抽象牌友类
public abstract class AbstractCardPartner
{
public int MoneyCount { get; set; } protected AbstractCardPartner()
{
MoneyCount = ;
} public abstract void ChangeCount(int count, AbstractMediator mediator);
} // 牌友A类
public class ParterA : AbstractCardPartner
{
// 依赖与抽象中介者对象
public override void ChangeCount(int count, AbstractMediator mediator)
{
mediator.AWin(count);
}
} // 牌友B类
public class ParterB : AbstractCardPartner
{
// 依赖与抽象中介者对象
public override void ChangeCount(int count, AbstractMediator mediator)
{
mediator.BWin(count);
}
} // 抽象中介者类
public abstract class AbstractMediator
{
protected AbstractCardPartner A;
protected AbstractCardPartner B; protected AbstractMediator(AbstractCardPartner a, AbstractCardPartner b)
{
A = a;
B = b;
} public abstract void AWin(int count);
public abstract void BWin(int count);
} // 具体中介者类
public class MediatorPater : AbstractMediator
{
public MediatorPater(AbstractCardPartner a, AbstractCardPartner b)
: base(a, b)
{
} public override void AWin(int count)
{
A.MoneyCount += count;
B.MoneyCount -= count;
} public override void BWin(int count)
{
B.MoneyCount += count;
A.MoneyCount -= count;
}
}
}

四、模式分析

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

设计模式のMediatorPattern(中介者模式)----行为模式的更多相关文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  3. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

  4. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  6. JS常用的设计模式(11)—— 中介者模式

    中介者对象可以让各个对象之间不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互. 打个比方,军火买卖双方为了安全起见,找了一个信任的中介来进行交易.买家A把钱交给中介B,然后从中 ...

  7. [JAVA设计模式]第四部分:行为模式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. .NET设计模式(14):代理模式(Proxy Pattern)(转)

    摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来 ...

  9. Java经典设计模式之十一种行为型模式(附实例和详解)

    Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...

  10. Java设计模式(14)责任链模式(Chain of Responsibility模式)

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...

随机推荐

  1. asp.net-基础-20180321

    C#与.NET的关系 C#不是语言,.net是平台.

  2. AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher

    報錯: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML ...

  3. python基础学习(十一)公共方法

    Python内置函数 Python 包含了以下内置函数: 切片 切片 使用 索引值 来限定范围,从一个大的 字符串 中 切出 小的 字符串 列表 和 元组 都是 有序 的集合,都能够 通过索引值 获取 ...

  4. Partition(hdu4651)2013 Multi-University Training Contest 5

    Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. 史上最全python面试题详解 (二)(附带详细答案(关注、持续更新))

    23.re的match和search区别? re.match()从开头开始匹配string. re.search()从anywhere 来匹配string. # 多行模式>>> re ...

  6. Python中的特殊属性与方法

    模块的特殊属性 __doc__ 模块的说明文档 __all__ 指明模块希望被使用的属性.类和方法 __file__ 模块所在路径 类的特殊属性 __slots__ 限制类的实例允许添加的属性,是一个 ...

  7. 异常: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ResourceManager: NodeManager from localhost doesn't satisfy minimum allocations, Sending SHUTDOWN s

    异常: Recieved SHUTDOWN signal from Resourcemanager ,Registration of NodeManager failed, Message from ...

  8. meta标签的http-equiv与content解析

    meta是html语言head区的一个辅助性标签,以下是meta的http-equiv属性和content属性的一些介绍. http-equiv属性 指示服务器在发送实际的文档之前,要在传送给浏览器的 ...

  9. iOS ---------NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

    遇到此问题的解决办法: 使用<NSURLSessionDelegate>中的didReceiveChallenge方法,方法中的代码如下: - (void)URLSession:(NSUR ...

  10. Javascript 对象 - 数学对象

    数学对象 JavaScript中提供了math对象,math对象包含一些常用的属相和方法.Math对象与Array对象.String对象.Data对象不同,没有构造函数,因此不能创建Math对象.可直 ...