【设计模式】中介者模式
2016-01-25 21:06
344 查看
中介者模式
Mediator,又称调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。优点
首先,Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator;其次,由于把对象如何协作进行了抽象,将中介作为要给独立的概念并将其封装在要给对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来了,也就是站在一个更宏观的角度去看待对象。
缺点
由于ColleagueMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。使用场景
1、一组对象以定义良好但是复杂的方式节能型通信的额场合;2、想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
代码结构
结构图
代码示例
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; //构造方法,得到中介者对象 } }
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); } } 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); } }
相关文章推荐
- http调试工具Charles Proxy用法详解
- Codeforces Round #340 (Div. 2) A
- Facebook Hacker Cup 2016 Round 2
- 10 绘制数字
- MySQL 5.5版本解决中文乱码问题时my.ini内[mysqld]项中不能再写default-character-set=utf8
- kafka c++客户端编译
- 荷兰风车标志
- MySQL的典型八小时问题
- 新浪微博个人详情页
- 23种设计模式之观察者模式
- Amazon的网络服务aws
- URAL 1180. Stone Game (博弈 + 规律)
- 二级列表展示数据库查询
- LaTex 空格问题~~~~~
- python 条件判断与循环
- LeetCode 63. Unique Paths II
- jersey获取各个参数的总结
- componentsJoinedByString和componentsSeparatedByString的使用
- Spring和springmvc父子容器关系
- OkHttp获取request请求进度