设计模式学习--------11.中介者模式学习
来源:互联网 发布:node.js addlistener 编辑:程序博客网 时间:2024/04/27 22:56
场景:
构建一个部门管理和人员管理的模块.比如一个部门可以有多个人,一个人可以属于多个部门。
现增加一些功能:
1.部门被撤销,就需要通知清除这个部门下面的所有人后再删除部门.
2.部门之间合并,需要把原来的两个部门撤销,新增一个新部门,将原来两个部门的人员归入新部门中.
3.人员离职,需要从原来的部门将其清除.
4. 人员调动,从原来部门清除,新增到新部门.
可以看到,部门类和人员类之间耦合交互频繁,每个类的改变都会影响到其他类。如何简化多个对象的交互呢?
定义:
用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显示的相互引用,从而使其耦合松散,
而且可以独立改变它们之间的交互。
角色:
Mediator:
中介者接口.在里面定义各个同事之间交互需要的方法。
package com.kris.study;public interface Mediator { public void changed(Colleague colleage);}
ConcreteMediator:
具体中介者实现对象,它需要了解并维护各个同事对象,并负责具体的协调各同事对象的交互关系。
package com.kris.study;public class ConcreteMediator implements Mediator {private ConcreteColleagueA colleagueA;private ConcreteColleagueB colleagueB;public void setColleagueA(ConcreteColleagueA colleagueA) {this.colleagueA = colleagueA;}public void setColleagueB(ConcreteColleagueB colleagueB) {this.colleagueB = colleagueB;}@Overridepublic void changed(Colleague colleage) { //某个Colleague对象发生了变化,需要与其他同事交互 //具体协调相应的同事对象来实现协作行为}}
Colleague:
同事类的定义,通常实现成为抽象类。主要负责约束同事对象的类型,并实现一些具体同事对象之间的公共功能。
package com.kris.study;public abstract class Colleague { private Mediator mediator; public Colleague(Mediator mediator){ this.mediator = mediator; } public Mediator getMediator(){ return mediator; }}
ConcreteColleague:
具体的同事类,实现自己的业务。在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他同事
的交互。
package com.kris.study;public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}public void someOperation(){getMediator().changed(this);}}
package com.kris.study;public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);}public void someOperation(){getMediator().changed(this);}}
在实际开发中,经常会简化中介者模式,来使开发变得简单。
比如会去掉同事对象的父类Colleague,任意对象只需要相互交互,就可以成为同事。
不定义Mediator接口,把具体的中介者对象实现为单例。
同事对象不再持有中介者,而是在需要的时候直接获取调用。
这样简化后的中介者模式称为广义中介者。
使用广义中介者模式解决场景中的例子:
package com.kris.study;/** * 部门类 */public class Dep {private String depId;private String depName;public String getDepId() {return depId;}public void setDepId(String depId) {this.depId = depId;}public String getDepName() {return depName;}public void setDepName(String depName) {this.depName = depName;}public boolean deleteDep(){Mediator mediator = Mediator.getInstance();mediator.deleteDep(depId);return true;}}
package com.kris.study;/** * 人员类 */public class User { private String userId; private String userName;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;} public boolean deleteUser(){Mediator mediator = Mediator.getInstance();mediator.deleteDep(userId);return true;} }
package com.kris.study;/** * 部门与人员对应关系类 */public class DepUserModel { private String depUserId; private String depId; private String userId;public String getDepUserId() {return depUserId;}public void setDepUserId(String depUserId) {this.depUserId = depUserId;}public String getDepId() {return depId;}public void setDepId(String depId) {this.depId = depId;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;} }
package com.kris.study;import java.util.ArrayList;import java.util.Collection;public class Mediator {private static Mediator mediator = new Mediator();private Mediator() {}public static Mediator getInstance() {return mediator;}private Collection<DepUserModel> depUserCol = new ArrayList<DepUserModel>();/** * 删除撤销某个部门 */public boolean deleteDep(String depId) {Collection<DepUserModel> tempCol = new ArrayList<DepUserModel>();for (DepUserModel du : depUserCol) {if (du.getDepId().equals(depId)) {tempCol.add(du);}}depUserCol.removeAll(tempCol);return true;}/** * 人员离职 */public boolean deleteUser(String userId){Collection<DepUserModel> tempCol = new ArrayList<DepUserModel>();for (DepUserModel du : depUserCol) {if (du.getUserId().equals(userId)) {tempCol.add(du);}}depUserCol.removeAll(tempCol);return true;}}
原理分析:
优点:松散耦合,集中控制
缺点: 过度集中化。同事对象交互过多,中介者对象就变得十分复杂,难于维护。
本质: 封装交互
- 设计模式学习--------11.中介者模式学习
- 设计模式学习----Mediator中介者模式
- 设计模式学习-----中介者模式
- 设计模式学习(十五):中介者模式
- 设计模式学习--中介者模式
- 设计模式学习--中介者模式
- 设计模式学习笔记--中介者模式
- 设计模式学习笔记--中介者模式
- 设计模式学习--中介者模式
- 设计模式学习之中介者模式
- 学习设计模式-中介者模式
- 设计模式学习—Mediator(中介者)
- 设计模式学习笔记十七(Mediator中介者模式)
- VB.net 学习设计模式(中介者模式)
- 设计模式学习笔记(十八)—Mediator中介者模式
- 设计模式学习笔记——中介者模式
- 学习设计模式之禅——中介者模式
- 设计模式学习笔记——中介者模式
- PHP中容易混淆的地方
- SCI收录期刊——航空航天学科
- Oracle VM VirtualBox 4.1.18+kubuntu14.04,使用samba与windows共享文件
- 充分利用ASP.NET缓存提高站点性能
- 1. printf 的用法
- 设计模式学习--------11.中介者模式学习
- 黑马程序员_JAVA专业术语
- 怎样清空一个对象(来自于缓存)?
- 如何把ASP编写成DLL
- Web project 和 java project 如何引用jar包
- java面试经历以及心得:第一家公司
- 设计模式之十一 命令模式
- C++将数字转为字符串,并拼接
- 使用myeclipse的反向工程来生成相应的hibernate映射文件和POJO类