设计模式之中介者模式
2015-10-12 21:10
393 查看
1、核心
-如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象”-我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星形结构
结构图:
2、本质
解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。3、应用场景
-MVC模式(其中的C,控制器就是一个中介者对象。M和C都和他打交道)-窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
-图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象
-java.lang.reflect.Method#invoke()
4、代码示例
问题:UML图:
/** * 部门抽象接口 * @author ly1 * */ public interface IDepartment { void selfAction(); void outAction(); }
/** * 财务部 * @author ly1 * */ public class Financial implements IDepartment{ private IMediator mediator; public Financial(IMediator mediator) { super(); this.mediator = mediator; mediator.register("financial", this); } @Override public void selfAction() { System.out.println("数钱!"); } @Override public void outAction() { mediator.comand("financial"); } }
/** * 开发部 * @author ly1 * */ public class Development implements IDepartment{ private IMediator mediator; public Development(IMediator mediator) { super(); this.mediator = mediator; mediator.register("development", this); } @Override public void selfAction() { System.out.println("项目开发中!"); } @Override public void outAction() { mediator.comand("financial"); } }
/** * 研发部 * @author ly1 * */ public class Research implements IDepartment{ private IMediator mediator; public Research(IMediator mediator) { super(); this.mediator = mediator; mediator.register("research", this); } @Override public void selfAction() { System.out.println("研究中!"); } @Override public void outAction() { mediator.comand("financial"); } }
/** * 中介抽象接口 * @author ly1 * */ public interface IMediator { void comand(String comand); void register(String name,IDepartment department); }
import java.util.HashMap; import java.util.Map; /** * 具体中介类:总经理 * @author ly1 * */ public class President implements IMediator{ private Map<String,IDepartment> list = new HashMap<String,IDepartment>(); @Override public void comand(String comand) { list.get(comand).selfAction(); } @Override public void register(String name, IDepartment department) { list.put(name, department); } }
/** * 客户端调用 * @author ly1 * */ public class Client { public static void main(String[] args) { IMediator mediator = new President(); IDepartment f = new Financial(mediator); IDepartment d = new Development(mediator); IDepartment r = new Research(mediator); d.selfAction(); d.outAction(); } } 结果: 项目开发中! 数钱!
相关文章推荐
- 沙朗新闻发布系统汇总
- 第一章_servlet
- oracle之分组函数、数字函数、字符函数、转换函数和日期函数
- [转]python对json的相关操作
- [BZOJ4029][HEOI2015] 定价
- Android中自定义Adapter的基本原理
- 设计模式之-观察者模式
- 关于linux小知识
- BZOJ 3144: [Hnoi2013]切糕
- Ubuntu下安装为知笔记Linux版本
- activiti报错ProcessEngines.getDefaultProcessEngine()为null
- selenium无法调用chrome或者firefox的原因
- C#软件开发实例.私人订制自己的屏幕截图工具(十一)编辑工具栏的实现
- C++ 知道禁用 copy-ctor/assign operator 是 C++ 程序员的试金石
- 数据结构之-线性表
- 算法-分治法实例:循环赛日程安排问题
- activiti报错ProcessEngines.getDefaultProcessEngine()为null
- 【DP】 HDU 4427 Math Magic
- ISLR_Power
- 卡尔曼滤波估计小车匀加速运动