中介者模式
2016-02-13 17:58
316 查看
中介者模式:
调停者模式,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们间的交互。需要一个中间人或者调停者;系统分割成许多对象——增加复用性
结构图:
优缺点:
由于concretemediator控制了集中化,于是把交互复制性变成了中介者的复杂性减少了同事类colleague的耦合,可以独立地改变或复用各个colleague类和mediator
应用于:
想定制一个分布在多个类中的行为,而又不想生成太多子类一组对象以定义良好但是复杂的方式进行通信的场合:form窗体上的控件以窗体为中介
书中的例子讲的很形象,通过安理会这个中介使得美国和伊拉克这两个国家通信、得以灵活地交互。
代码举例;
class Program { static void Main(string[] args) { UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil(); USA c1 = new USA(UNSC);//对象了解中介 Iraq c2 = new Iraq(UNSC); UNSC.Colleague1 = c1;//中介认识对象 UNSC.Colleague2 = c2; c1.Declare("\n不准研制核武器,否则要发生战争");//通过中介发送消息 c2.Declare("\n我们没有核武器,也不怕侵略"); Console.Read(); } } abstract class UniteNations //联合国:抽象中介者 { //声明;抽象的发送消息方法,得到同事消息、发送消息 public abstract void Declare(string message, Country colleague); } abstract class Country//国家、抽象同事类 { protected UniteNations mediator; public Country (UniteNations mediator) { this.mediator = mediator;//得到中介者 } } class USA:Country//具体同事类:美国 { public USA(UniteNations mediator) : base(mediator) { } public void Declare(string message)//发送消息是安理会Unsc发送的 { mediator.Declare(message, this);//调用 } public void GetMessage(string message)//获得消息 { Console.WriteLine("\n美国获得对方消息"+message ); } } class Iraq:Country { public Iraq(UniteNations mediator) : base(mediator) { } public void Declare(string message) { mediator.Declare(message, this); } public void GetMessage(string message) { Console.WriteLine("伊拉克获得消息"+message ); } } class UnitedNationsSecurityCouncil : UniteNations//具体中介类 { private USA colleague1;//安理会了解所有国家 private Iraq colleague2;//所以拥有美国、伊拉克对象属性 public USA Colleague1 { set { colleague1 = value; } } public Iraq Colleague2 { set { colleague2 = value; } } //重写了“声明”方法,实现了两个对象间的通信 public override void Declare(string message, Country colleague) { if (colleague ==colleague1 )//根据对象作出选择判断 { colleague2.GetMessage(message);//通知对象 } else//如果是伊朗则美国收到消息 { colleague1.GetMessage(message); } } } }
相关文章推荐
- poj2430 2010.7.31
- Educational Codeforces Round 7
- javaweb入门笔记(2)-http入门
- Cursor
- Linux下忘记mysql密码该如何修改mysql密码
- 319. Bulb Switcher LeetCode
- csdn博客积分规则
- Hdu3231【拓扑排序】
- javaweb入门笔记(1)-Tomcat
- 【POJ】3468 A Simple Problem with Integers
- Eclipse 文本编辑快捷键
- 第一行代码-5.4 使用本地广播
- 流式大数据处理的三种框架:Storm,Spark和Samza
- 使用Intent和IntentFilter进行通信
- 【VB6】VB6类库项目中的Persistable
- java基础巩固笔记(5)-多线程之线程并发库
- 关于属性
- java基础巩固笔记(5)-多线程之共享数据
- storm的基础介绍_数据分析_大数据
- PHP常用设计模式之委托设计模式