一、模式解析

  用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

中介模式又叫调停者模式,他有如下特点:

1、有多个系统或者对象发生交互,但又不能直接进行交互;

2、通过一个中介者来保留所有的交互对象(又叫同事类)的引用;

3、同事类同事也需要保留中介者的引用,以便调用中介者中的方法与其他同事类发生交互

4、中介者根据实际情况,如果系统复杂,有多个中介者,那么可以编写抽象中介者,如果没有则直接编写具体中介者

二、模式代码

1、抽象同事类

package mediator.patten;

public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator=mediator;
}
}

2、抽象中介者

package mediator.patten;
/**
* 抽象中介者
* @author zjl
* @time 2016-2-12
*
*/
public abstract class Mediator {
public abstract void send(String msg,Colleague colleague);
}

3、具体同事类1

package mediator.patten;

public class ConcreteColleague1 extends Colleague {

    public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message, this);
}
public void notify(String message){
System.out.println("同事1得到的消息为:"+message);
} }

4.具体同事类2

package mediator.patten;

public class ConcreteColleague2 extends Colleague {

    public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String message){
mediator.send(message, this);
}
public void notify(String message){
System.out.println("同事2得到的消息为:"+message);
} }

5、具体中介者

package mediator.patten;

public class ConcreteMediator extends Mediator {
private ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2; public void setColleague1(ConcreteColleague1 colleague){
this.colleague1=colleague;
}
public void setColleague2(ConcreteColleague2 colleague){
this.colleague2=colleague;
} @Override
public void send(String msg, Colleague colleague) {
if(colleague==colleague1){
colleague2.notify(msg);
}else {
colleague1.notify(msg);
}
} }

5、客户端代码

package mediator.patten;

public class Client {
public static void main(String[] args) {
ConcreteMediator mediator=new ConcreteMediator();
ConcreteColleague1 colleague1=new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2=new ConcreteColleague2(mediator); mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2); colleague1.send("吃饭了吗?");
colleague2.send("吃过了");
}
}

6、执行结果

同事2得到的消息为:吃饭了吗?
同事1得到的消息为:吃过了

三、模式分析

  1、中介者模式使用了中介类,保存了所有同事类的引用,将同事类的关联进行了解耦,但是会大大增加中介类的复杂度。

  2、中介类和同事类由于传递交互的要求,形成了彼此调用,加大了使用难度。

  3、中介类不仅需要保存同事类的引用,还需要记录他们之间的交互要求,判断每次交互应该发送给哪个同事类。

针对第3点,案例中的交互要求是传递了自身的引用,觉得是不合理,应该改为传递需要交互对象的特殊标示符,虽然理论上中介模式需要对对象的关联进行解耦,但是个人因为对象之间的关系仍然需要保存,否则按照模式标准代码,仅仅增加一个同事3,就会造成无法进行处理。

针对1和2仅能在发生互相的网状调用时,对代码进行检查,是否设计问题,总之此模式比较复杂,需要慎用。

四、应用场景

  在工作中似乎很少接触到一个系统中中介者模式的使用,但我们对于系统间可以看到目前流行的银行综合前置和企业esb均为此模式的使用,应用系统开发时候,仅需要实现esb指定的接口模式,与银行其他系统的通讯格式由esb自动完成匹配,并且传输到指定的系统。

  特别强调:应用系统需要保存的是esb指定地址和每个请求的交易代码,也就是我们3.1和3.3的内容

五、场景代码

  由于在一个系统中暂时未找到合适场景,所以暂略。

[工作中的设计模式]中介模式模式Mediator的更多相关文章

  1. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

  2. [工作中的设计模式]责任链模式chain

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

  3. 7. 星际争霸之php设计模式--中介者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  5. javascript设计模式--中介者模式(Mediator)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  7. 设计模式-中介者模式(Mediator)

    场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...

  8. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

  9. 设计模式-中介者模式(Mediator)

    /***中介者模式在消息队列中的应用*/package test.mediator; public abstract class Message { private Messages messages ...

随机推荐

  1. vim编辑器的使用

    I 在光标所在行的行首插入 A 在光标所在行的行尾插入 { 移动到上一段 } 移动到下一段 空格向后移动一格 H 屏幕顶部 M 屏幕中间 L 屏幕下方 n| 使光标移动到第几个字符处 ngg 移动到制 ...

  2. Visual Studio 如何使用代码片段Code Snippet提高编程速度!!!

      使用Code Snippet简化Coding 在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符 ...

  3. Java开发11个过不去的梗

    现在随着编程的普及,作为java程序猿开发的过程逐渐的受到领导的重视,无论自己的经理是能看懂,还是不能看懂,一些事项必须注意起来,不要让自己将来处于不尴不尬的境地,当然这样也方便你我他 1.不在属性文 ...

  4. lodop打印控件

    http://www.c-lodop.com/demolist/PrintSampIndex.html

  5. [UML]UML系列——用例图中的各种关系(include、extend)

    用例图中的各种关系 一.参与者与用例间的关联关系 参与者与用例之间的通信,也成为关联或通信关系. 二.用例与用例之间的关系 包含关系(include) 扩展关系(extend) 包含关系 (1)  概 ...

  6. PHP系统声明式事务处理

    转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...

  7. java笔记--关于线程同步(7种同步方式)

    关于线程同步(7种方式) --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897440.html"谢谢-- 为何要使用同步? ...

  8. BlockingQueue 阻塞队列,很有用的一种

    BlockingQueue的核心方法:放入数据: offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳, 则返 ...

  9. java.lang.UnsatisfiedLinkError: Couldn't load BaiduMapSDK 的解决方法

    遇到找不到so的同学们可以先从以下几个方面来检查问题: 1.so的名字是不是被修改了?我们SDK的so名字是固定的,如果您自行对它进行了重命名操作,那肯定是没法找到so的.2.so放置位置不对.so需 ...

  10. sql server 2008 数据的行转列

    create table tb(id int, value varchar(10)) insert into tb values(1,'aa') insert into tb values(1,'bb ...