Java设计模式系列之中介者模式
中介者模式(Mediator)的定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式(Mediator)的适用性
1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3.想定制一个分布在多个类中的行为,但又不想生成太多的子类。
中介者模式(Mediator)的参与者
1.Mediator
中介者定义一个接口用于与各同事(Colleague)对象通信。
2.ConcreteMediator
具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
3.Colleague:
抽象同事类。
4.Colleagueclass
具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者
中介者模式的UML类图
具体代码实现:
第一步:定义Mediator
//定义抽象Mediator,可以与同时们进行联络
public abstract class Mediator {
public abstract void contact(String content,Colleague coll);
}
第二步:定义抽象Colleague
public class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
第三步:定义具体Colleagueclass
public class ColleagueA extends Colleague {
// 具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事A"+name+"获得信息"+message);
}
//同事A与中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
public class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事B"+name+"获得信息"+message);
}
//同事B与中介者通信
public void contact(String message){
mediator.contact(message, this);
}
}
第四步:定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
//定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
public class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB; public ColleagueA getCollA() {
return collA;
} public void setCollA(ColleagueA collA) {
this.collA = collA;
} public ColleagueB getCollB() {
return collB;
} public void setCollB(ColleagueB collB) {
this.collB = collB;
} @Override
public void contact(String content, Colleague coll) {
if (coll==collA) {
collB.getMessage(content);
} else {
collA.getMessage(content);
}
}
}
第五步:定义Client,测试中介者模式的使用
public class Client {
/**
* @param args
*/
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
// 定义中介者
ConcreteMediator mediator = new ConcreteMediator();
// 定义具体同事类
ColleagueA colleagueA = new ColleagueA("张三", mediator);
ColleagueB colleagueB = new ColleagueB("李四", mediator);
// 中介者知晓每一个具体的Colleague类
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是A,我要和同事B说说工作的事情");
colleagueB.contact("我是B,我下午有时间,下午商量吧");
}
}
运行结果:
同事B李四获得信息:我是A,我要和同事B说说工作的事情
同事A张三获得信息:我是B,我下午有时间,下午商量吧
总结:
中介者就是一个处于众多对象中间,并恰当地处理众多对象之间相互之间的联系的角色。以上代码中只有两个参与者类,但是这些我们都可以根据中介者模式的宗旨进行适当地扩展,即增加参与者类,然后中介者就得担负更加重的任务了,我们看到上面具体中介者类Mediator中的方法比较多而且有点乱。 所以,在解耦参与者类之间的联系的同时,中介者自身也不免任务过重,因为几乎所有的业务逻辑都交代到中介者身上了,可谓是“万众期待”的一个角色了。这就是中介者模式的不足之处了。此外,上面这个代码例子的参与者的属性和方法都是一样的,我们可以抽取一个抽象类出来,减少代码,但是有时候我们根本抽取不了多个“参与者”之间的共性来形成一个抽象类,这也大大增加了中介者模式的使用难度。
Java设计模式系列之中介者模式的更多相关文章
- Java设计模式学习记录-中介者模式
前言 中介者模式听名字就能想到也是一种为了解决耦合度的设计模式,其实中介者模式在结构上与观察者.命令模式十分相像:而应用目的又与结构模式“门面模式”有些相似.但区别于命令模式的是大多数中介者角色对于客 ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...
- java设计模式-----17、中介者模式
概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...
- Java设计模式系列之动态代理模式(转载)
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...
- 《JAVA设计模式》之中介者模式(Mediator)
在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...
- Java设计模式系列之责任链模式
责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...
- Java设计模式系列3--抽象工厂模式(Abstract Factory Method)
2014-02-26 10:55:47 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果 ...
- Java设计模式系列2--工厂方法模式(Factory Method)
2014-02-26 09:56:45 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式分为三种: 1. 普通工厂模式 建立一个工厂类,对 ...
随机推荐
- SQLserver临时表
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='#temp') DROP TABLE #tempGOSELECT ID,XM,ADDDW INTO #t ...
- Linux命令之chmod 及+s 参数(临时以所有者权限执行)
转自: http://blog.csdn.net/shaobingj126/article/details/7031221 chmod用于改变文件或目录的访问权限.用户用它控制文件或目录的访问权限.该 ...
- Android权限安全(9)Android权限特点及权限管理服务AppOps Service
Android权限特点 权限管理服务AppOps Service 图中元素介绍: Ignore 是不提示的,Allow 是允许,Reject 是拒绝 Client是一个使用sms 的应用, AppOp ...
- Android权限安全(8)ContentProvider基于URI的安全
一.provider可以通过binder得到客户的uid,然后进程权限检查. 二,provider临时权限 场景: Email的内容在provider中提供,Email的客户端可读基其内容,现在一封 ...
- GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态
1.命名空间:using System.Runtime.InteropServices;2.导入方法[DllImport("user32.dll", EntryPoint = &q ...
- 【Todo】深入理解Javascript系列
真的很好,要看 http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
- axis : java.lang.NoSuchMethodError
Hi friends,Iam getting the following error when deploying my app in jboss error.Iam new to axis .can ...
- UVa 11916 (离散对数) Emoogle Grid
因为题目要求同列相邻两格不同色,所以列与列之间不影响,可以逐列染色. 如果一个格子的上面相邻的格子,已经被染色则染这个格子的时候,共有k-1中选择. 反过来,如果一个格子位于第一列,或者上面相邻的格子 ...
- UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
这个题能1A纯属运气,要是WA掉,可真不知道该怎么去调了. 题意: 这是完全独立的6个子问题.代码中是根据字符串的长度来区分问题编号的. 给出三角形三点坐标,求外接圆圆心和半径. 给出三角形三点坐标, ...
- Mysql分支
MySQL是历史上最受欢迎的免费开源程序之一.它是成千上万个网站的数据库骨干,并且可以将它(和linux)作为过去10年里Internet呈指数级增长的一个有力证明. 那么,如果MySQL真的这么重要 ...