java设计模式---调停者模式

- //抽象同事类
- abstract class AbstractColleague {
- protected AbstractMediator mediator;
- /**既然有中介者,那么每个具体同事必然要与中介者有联系,
- * 否则就没必要存在于 这个系统当中,这里的构造函数相当
- * 于向该系统中注册一个中介者,以取得联系
- */
- public AbstractColleague(AbstractMediator mediator) {
- this.mediator = mediator;
- }
- // 在抽象同事类中添加用于与中介者取得联系(即注册)的方法
- public void setMediator(AbstractMediator mediator) {
- this.mediator = mediator;
- }
- }
- //具体同事A
- class ColleagueA extends AbstractColleague {
- //每个具体同事都通过父类构造函数与中介者取得联系
- public ColleagueA(AbstractMediator mediator) {
- super(mediator);
- }
- //每个具体同事必然有自己分内的事,没必要与外界相关联
- public void self() {
- System.out.println("同事A --> 做好自己分内的事情 ...");
- }
- //每个具体同事总有需要与外界交互的操作,通过中介者来处理这些逻辑并安排工作
- public void out() {
- System.out.println("同事A --> 请求同事B做好分内工作 ...");
- super.mediator.execute("ColleagueB", "self");
- }
- }
- //具体同事B
- class ColleagueB extends AbstractColleague {
- public ColleagueB(AbstractMediator mediator) {
- super(mediator);
- }
- public void self() {
- System.out.println("同事B --> 做好自己分内的事情 ...");
- }
- public void out() {
- System.out.println("同事B --> 请求同事A做好分内工作 ...");
- super.mediator.execute("ColleagueA", "self");
- }
- }
中介者类族:
- //抽象中介者
- abstract class AbstractMediator {
- //中介者肯定需要保持有若干同事的联系方式
- protected Hashtable<String, AbstractColleague> colleagues = new Hashtable<String, AbstractColleague>();
- //中介者可以动态地与某个同事建立联系
- public void addColleague(String name, AbstractColleague c) {
- this.colleagues.put(name, c);
- }
- //中介者也可以动态地撤销与某个同事的联系
- public void deleteColleague(String name) {
- this.colleagues.remove(name);
- }
- //中介者必须具备在同事之间处理逻辑、分配任务、促进交流的操作
- public abstract void execute(String name, String method);
- }
- //具体中介者
- class Mediator extends AbstractMediator{
- //中介者最重要的功能,来回奔波与各个同事之间
- public void execute(String name, String method) {
- if("self".equals(method)){ //各自做好分内事
- if("ColleagueA".equals(name)) {
- ColleagueA colleague = (ColleagueA)super.colleagues.get("ColleagueA");
- colleague.self();
- }else {
- ColleagueB colleague = (ColleagueB)super.colleagues.get("ColleagueB");
- colleague.self();
- }
- }else { //与其他同事合作
- if("ColleagueA".equals(name)) {
- ColleagueA colleague = (ColleagueA)super.colleagues.get("ColleagueA");
- colleague.out();
- }else {
- ColleagueB colleague = (ColleagueB)super.colleagues.get("ColleagueB");
- colleague.out();
- }
- }
- }
- }
测试类:
- //测试类
- public class Client {
- public static void main(String[] args) {
- //创建一个中介者
- AbstractMediator mediator = new Mediator();
- //创建两个同事
- ColleagueA colleagueA = new ColleagueA(mediator);
- ColleagueB colleagueB = new ColleagueB(mediator);
- //中介者分别与每个同事建立联系
- mediator.addColleague("ColleagueA", colleagueA);
- mediator.addColleague("ColleagueB", colleagueB);
- //同事们开始工作
- colleagueA.self();
- colleagueA.out();
- System.out.println("======================合作愉快,任务完成!\n");
- colleagueB.self();
- colleagueB.out();
- System.out.println("======================合作愉快,任务完成!");
- }
- }
测试结果:
- 同事A --> 做好自己分内的事情 ...
- 同事A --> 请求同事B做好分内工作 ...
- 同事B --> 做好自己分内的事情 ...
- ======================合作愉快,任务完成!
- 同事B --> 做好自己分内的事情 ...
- 同事B --> 请求同事A做好分内工作 ...
- 同事A --> 做好自己分内的事情 ...
- ======================合作愉快,任务完成!
此外,上面这个代码例子是相当理想的了,有时候我们根本抽取不了“同事”之间的共性来形成一个AbstractColleague抽象同事类,这也大大增加了中介者模式的使用难度。
修改:
由于上面代码实现中存在 benjielin 前辈提出的“双向关联暴露在App中”的不足之处,根据给出的改进方法2,修改上面代码,如下:
修改后的同事类族:
- //抽象同事类
- abstract class AbstractColleague {
- protected AbstractMediator mediator;
- //舍去在构造函数中建立起与中介者的联系
- // public AbstractColleague(AbstractMediator mediator) {
- // this.mediator = mediator;
- // }
- // 在抽象同事类中添加用于与中介者取得联系(即注册)的方法
- public void setMediator(AbstractMediator mediator) {
- this.mediator = mediator;
- }
- }
- //具体同事A
- class ColleagueA extends AbstractColleague {
- //舍去在构造函数中建立起与中介者的联系
- // public ColleagueA(AbstractMediator mediator) {
- // super(mediator);
- // }
- //每个具体同事必然有自己分内的事,没必要与外界相关联
- public void self() {
- System.out.println("同事A --> 做好自己分内的事情 ...");
- }
- //每个具体同事总有需要与外界交互的操作,通过中介者来处理这些逻辑并安排工作
- public void out() {
- System.out.println("同事A --> 请求同事B做好分内工作 ...");
- super.mediator.execute("ColleagueB", "self");
- }
- }
- //具体同事B
- class ColleagueB extends AbstractColleague {
- //舍去在构造函数中建立起与中介者的联系
- // public ColleagueB(AbstractMediator mediator) {
- // super(mediator);
- // }
- public void self() {
- System.out.println("同事B --> 做好自己分内的事情 ...");
- }
- public void out() {
- System.out.println("同事B --> 请求同事A做好分内工作 ...");
- super.mediator.execute("ColleagueA", "self");
- }
- }
修改后的中介者:
- //抽象中介者
- abstract class AbstractMediator {
- //中介者肯定需要保持有若干同事的联系方式
- protected Hashtable<String, AbstractColleague> colleagues = new Hashtable<String, AbstractColleague>();
- //中介者可以动态地与某个同事建立联系
- public void addColleague(String name, AbstractColleague c) {
- // 在中介者这里帮助具体同事建立起于中介者的联系
- c.setMediator(this);
- this.colleagues.put(name, c);
- }
- //中介者也可以动态地撤销与某个同事的联系
- public void deleteColleague(String name) {
- this.colleagues.remove(name);
- }
- //中介者必须具备在同事之间处理逻辑、分配任务、促进交流的操作
- public abstract void execute(String name, String method);
- }
- //测试类
- public class Client {
- public static void main(String[] args) {
- //创建一个中介者
- AbstractMediator mediator = new Mediator();
- //不用构造函数为具体同事注册中介者来取得联系了
- // ColleagueA colleagueA = new ColleagueA(mediator);
- // ColleagueB colleagueB = new ColleagueB(mediator);
- ColleagueA colleagueA = new ColleagueA();
- ColleagueB colleagueB = new ColleagueB();
- //中介者分别与每个同事建立联系
- mediator.addColleague("ColleagueA", colleagueA);
- mediator.addColleague("ColleagueB", colleagueB);
- //同事们开始工作
- colleagueA.self();
- colleagueA.out();
- System.out.println("======================合作愉快,任务完成!\n");
- colleagueB.self();
- colleagueB.out();
- System.out.println("======================合作愉快,任务完成!");
- }
- }
本文来自:http://haolloyin.blog.51cto.com/1177454/333810/
java设计模式---调停者模式的更多相关文章
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
随机推荐
- hive升级遇到的几个小问题
1.hiveserver2正常启动,但是beeline连不上服务. 我的服务是开在本机的,但是用主机名和127好像都不能访问服务了 jdbc:hive2://172.19.1.11:10000> ...
- sql 复习练习
一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- ...
- Linux设置文件读写权限
设置文件夹的读写权限: sudo chmod -R 777 /data 权限码描述 sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读 ...
- Jmeter(三)_配置元件
HTTP Cookie Manager 用来存储浏览器产生的用户信息 Clear Cookies each Iteration:每次迭代请求,清空cookies,GUI中定义的任何cookie都不会被 ...
- 数据结构Java版之交换算法(一)
交换的本质是拷贝,其中拷贝包括两种方式.值拷贝和指针拷贝,在java中没有指针,为此,我们可以理解为地址拷贝,在我看来,指针就是地址. 1.传值方式示例: 由上述示例可得,传值,不能起到交换的作用,原 ...
- zabbix API基本使用方法介绍
前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...
- Openstack: Single node Installation and External Network Accessing Configuration Guide
Summary of installation Step 0: Prerequisites Step 1: Create Openstack hostsystem Step 2: Config Ope ...
- Dynamics CRM2016 Web Api之查询查找字段的相关属性
之前有篇博文介绍了如何获取查找字段的name值(跳转),本篇在此基础上再延伸下,实现的效果类似于EntityReference,可以取到查找字段的id,name,localname. 这里我以客户实体 ...
- Android的四大组件及应用安装安全问题(4)
Android的四大组件及组件间通信 如果想对四大组件有深入的了解,那永远不要停留在一些条条干干的SDK API的认识,需要了解他的通讯,他的复用,他的边界问题,这样才会对四大组件有透明的认识. 四大 ...
- Spring中配置DataSource的六种方式
第一种:beans.xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource ...