博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中介者模式(Mediator Pattern)
阅读量:5230 次
发布时间:2019-06-14

本文共 2434 字,大约阅读时间需要 8 分钟。

中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。 Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently。

 

中介者模式的组成部分:

1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。
2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。
3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。
来自《设计模式》一书的类图:

由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。所以抽象中介者角色往往是不存在 的,或者只是一个标示接口。如果有幸能够提炼出真正带有行为的抽象中介者角色,我想同事角色对具体中介者角色的选择也是策略的一种应用。

代码:

public abstract class Mediator    {        public abstract void Send(string message, Colleage c);    }    public class ConcreteMediator : Mediator    {        public ConcreteColleague1 c1{
get;set;} public ConcreteColleague2 c2 { get; set; } public override void Send(string message,Colleage c) { if (c == c1) { this.c1.Notify(message); } else { this.c2.Notify(message); } } } public abstract class Colleage { protected Mediator mediator; public Colleage(Mediator m) { this.mediator = m; } } public class ConcreteColleague1 : Colleage { public ConcreteColleague1(Mediator mediator):base(mediator) {} public void Send(string message) { mediator.Send(message, this); } public void Notify(string message) { Console.Write("ConcreteCollage1 action " + message); } } public class ConcreteColleague2 : Colleage { public ConcreteColleague2(Mediator m):base( m) {} public void Send(string message) { mediator.Send(message, this); } public void Notify(string message) { Console.Write("ConcreteCollage2 action " + message); } }

调用:

ConcreteMediator m = new ConcreteMediator();            //让同事认识中介者对象            ConcreteColleague1 c1 = new ConcreteColleague1(m);            ConcreteColleague2 c2 = new ConcreteColleague2(m);            //让中介者认识具体对象            m.c1 = c1;            m.c2 = c2;            //具体发送的消息都是通过中介者转发            c1.Send("吃饭了吗");            c2.Send("你请客?");

 

转载于:https://www.cnblogs.com/nygfcn1234/p/3408719.html

你可能感兴趣的文章
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书_2019年
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>