设计模式之中介者模式
2015-06-30 21:26
363 查看
1、定义
2、UML
各个类说明:
3、优点:
4、缺点:
5、适合应用场景:
6、例子:
写个例子练练手
运行结果:
因为是初学者,例子比较简单,忘见谅。
中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使耦合松散,而且可以独立的改变他们之间的交互。 |
各个类说明:
Mediator:抽象终结者,定义了同事对象到终结者对象的接口 Colleague:抽象同事类 ConcreteMediator:具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。 ConcreteColleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象。 |
减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator 由于把对象如何写作进行了抽象,将终结作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了他们之间的交互上来到了,也就是站在一个更宏观的角度去看待系统。 |
由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteMediator都复杂 |
中介者模式一般应用于一组对象以定义良好,但是复杂的方式进行通信的场合,比如窗体Form对象或Web页面aspx,以及想定制一个分部在多个类中的行为,而又不想生成太多的子类的场合。 |
写个例子练练手
package com.zcr.Mediator; //抽象同事类 public abstract class Colleague { protected Mediator mediator; //构造方法,得到中介者对象 public Colleague(Mediator mediator) { this.mediator = mediator; } }
package com.zcr.Mediator; public class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } public void Send(String message) { mediator.Send(message, this); } public void Notify(String message) { System.out.println("同事1得到消息:"+message); } }
package com.zcr.Mediator; public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); // TODO Auto-generated constructor stub } public void Send(String message) { mediator.Send(message, this); } public void Notify(String message) { System.out.println("同事2得到消息:"+message); } }
package com.zcr.Mediator; public class ConcreteMediator extends Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2; public ConcreteColleague1 getColleague1() { return colleague1; } public void setColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public ConcreteColleague2 getColleague2() { return colleague2; } public void setColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } @Override public void Send(String message, Colleague colleague) { if(colleague == colleague1) { colleague2.Notify(message); } else { colleague1.Notify(message); } } }
package com.zcr.Mediator; //抽象中介者类 public abstract class Mediator { //定义一个抽象的发送消息的方法,得到同时对象和发送消息 public abstract void Send(String message,Colleague colleague); }
package com.zcr.Mediator; public class MediatorTest { public static void main(String[] args) { ConcreteMediator m = new ConcreteMediator(); //让两个具体同时类认识中介者对象 ConcreteColleague1 c1 = new ConcreteColleague1(m); ConcreteColleague2 c2 = new ConcreteColleague2(m); //让中介者认识各个具体同时类对象 m.setColleague1(c1); m.setColleague2(c2); //具体同时类对象的发送信息都是通过中介者发送的 c1.Send("吃过饭了吗?"); c2.Send("没有呢,打算请客?"); } }
运行结果:
因为是初学者,例子比较简单,忘见谅。
相关文章推荐
- MonaServer服务
- 网狐棋牌游戏平台服务器架构设计分析
- JSP语法简介
- Guava源码学习(1)--Strings.Repeat
- 菜鸟好文推荐(八)——为什么我不想成为Web前端程序员
- 浅析C#中的“==”和Equals
- 网站
- [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
- 数据库VIEW(视图)
- 整理阅读的论文(二)
- 计算机网络原理笔记
- 黑马-OC类和方法笔记
- Java之旅(1)—Class类
- 黑客们的故事(连载七)一个黑客的思考
- javascript入门教程笔记
- asp.net中使用Uploadify插件实现多张图片上传,上传后可显示缩略图、删除图片
- StarUML使用说明-指导手册
- 基于jquery实现的类似百度搜索的输入框自动完成功能
- java多线程之CountdownLatch简单应用
- 散列表-开放地址法和链地址法的实现