中介者模式(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设计模式系列之中介者模式的更多相关文章

  1. Java设计模式学习记录-中介者模式

    前言 中介者模式听名字就能想到也是一种为了解决耦合度的设计模式,其实中介者模式在结构上与观察者.命令模式十分相像:而应用目的又与结构模式“门面模式”有些相似.但区别于命令模式的是大多数中介者角色对于客 ...

  2. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 重学 Java 设计模式:实战中介者模式「按照Mybaits原理手写ORM框架,给JDBC方式操作数据库增加中介者场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 同龄人的差距是从什么时候拉开的 同样的幼儿园.同样的小学.一样 ...

  4. java设计模式-----17、中介者模式

    概念: Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中, ...

  5. Java设计模式系列之动态代理模式(转载)

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...

  6. 《JAVA设计模式》之中介者模式(Mediator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述调停者(Mediator)模式的: 调停者模式是对象的行为模式.调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用.从 ...

  7. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  8. Java设计模式系列3--抽象工厂模式(Abstract Factory Method)

    2014-02-26 10:55:47 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果 ...

  9. Java设计模式系列2--工厂方法模式(Factory Method)

    2014-02-26 09:56:45 声明:本文不仅是本人自己的成果,有些东西取自网上各位大神的思想,虽不能一一列出,但在此一并感谢! 工厂方法模式分为三种: 1. 普通工厂模式 建立一个工厂类,对 ...

随机推荐

  1. 9本java程序员必读的书

    来源:http://mp.weixin.qq.com/s?__biz=MjM5NzA1MTcyMA==&mid=202904638&idx=2&sn=21dd20438e32a ...

  2. init_MUTEX

    2.6.25及以后的linux内核版本废除了init_MUTEX函数 新版本使用sema_init函数 平台:X86 32位内核:2.6.24定义: 引用 static inline void ini ...

  3. Bitset小结 (POJ2443 & HDU4920)

    学了下bitset用法,从网上找的一些bitset用法,并从中调出一些常用的用法. 构造函数bitset<n> b; b有n位,每位都为0.参数n可以为一个表达式.如bitset<5 ...

  4. The secret code

    The secret code Input file: stdinOutput file: stTime limit: 1 sec Memory limit: 256 MbAfter returnin ...

  5. poj3207 Ikki’s Story IV – Panda’s Trick

    2-SAT. tarjan缩点.强连通分量的点要选一起选. #include<cstdio> #include<algorithm> #include<cstring&g ...

  6. UVa 10596 Moring Walk【欧拉回路】

    题意:给出n个点,m条路,问能否走完m条路. 自己做的时候= =三下两下用并查集做了交,WA了一发-后来又WA了好几发--(而且也是判断了连通性的啊) 搜了题解= = 发现是这样的: 因为只要求走完所 ...

  7. sql字符串函数(转)

    计算字符串长度 len()用来计算字符串的长度 select sname ,len(sname) from student 字符串转换为大.小写 lower() 用来将一个字符串转换为小写,upper ...

  8. POJ 3352 Road Construction(边双连通分量,桥,tarjan)

    题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...

  9. Gulp使用指南

    Grunt靠边,全新的建构工具来了.Gulp的code-over-configuration不只让撰写任务(tasks)更加容易,也更好阅读及维护. Glup使用node.js串流(streams)让 ...

  10. jQuery的datatable怎么才能给某一列添加超链接?

    aocolumeDef.这个里面去定义.return返回的字符串会代替原来cell里面的内容 e.g: datatable=$('#dt_basic').dataTable({ "bAuto ...