一.中介者模式的简介
中介者模式(Mediator Pattern)用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互,该模式属于行为型模式。
中介者模式的核心思路: 多个对象之间若需交互,为防止这些对象互相引用(调用)的混乱,为降低这一系列对象之间的耦合度,可以使用一个中介者对象(Mediator)来管理(封装处理)多个对象(Colleague)之间的交互,这样新增和删除需要交互的对象时,不会影响到其他对象的正常使用,所有的交互任务只需要中介者类进行转发,中介者类需要关联所有需要交互的对象即可。
中介者模式应用案例: 在MVC模式中,C(控制器)就是M(数据模型)和V(视图)的中介者,负责数据层和视图层之间的交互。
二.中介者模式的设计类图
(图片加载慢,多刷新几下,耐心等待……)
注:同事类(Colleague)和中介者抽象类(Mediator),二者是聚合关系。
聚合关系:同事类(Colleague)包含中介者抽象类(Mediator),但中介者抽象类(Mediator)不是同事类(Colleague)的一部分。
三.中介者模式的代码及讲解
1.抽象中介者类(Mediator)
设计分析: 抽象中介者类
提供一个处理对象之间交互的方法接口,并且关联需要通中介者交互的对象。
package com.pattern.Mediator.Mediator;
import com.pattern.Mediator.Colleague.Colleague;
/**
* 抽象中介者类
*
*/
public abstract class Mediator {
//中介转发通信的 方法
public void send(String msg,Colleague colleague) {
}
}
2.抽象同事类(Colleague)
设计分析: 实现抽象类的方法,并且知道所有同事类,从具体的同事对象接收消息,并且向具体的同事的对象发出命令。
package com.pattern.Mediator.Colleague;
import com.pattern.Mediator.Mediator.Mediator;
/**
* 抽象同事类
*
*/
public abstract class Colleague {
//依赖中介
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
3.具体中介者类(ConcreteMediator)
设计分析: 实现抽象类的方法,并且知道所有通识类,从具体的同事对象接收消息,并且向具体的同事的对象发出命令。
package com.pattern.Mediator.Mediator;
import com.pattern.Mediator.Colleague.Colleague;
import com.pattern.Mediator.Colleague.ConcreteColleague1;
import com.pattern.Mediator.Colleague.ConcreteColleague2;
/**
* 具体的中介者类
*
*/
public class ConcreteMediator extends Mediator {
private ConcreteColleague1 concreteColleague1;//同事1
private ConcreteColleague2 concreteColleague2;//同事2
public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
this.concreteColleague1 = concreteColleague1;
}
public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
this.concreteColleague2 = concreteColleague2;
}
@Override
public void send(String msg, Colleague colleague) {
//判断是谁先发起通信,然后中介将信息传达给另一个人
if (colleague == concreteColleague1) {
concreteColleague2.notify(msg);
} else {
concreteColleague1.notify(msg);
}
super.send(msg, colleague);
}
}
4.具体同事类(ConcreteColleague)
设计分析: 每个具体的同事类只需要知道自己的行为,并且认识中介者类即可。
具体同事类1:
package com.pattern.Mediator.Colleague;
import com.pattern.Mediator.Mediator.Mediator;
/**
* 具体同事类1
*
*/
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
//依赖中介,传达信息
public void send(String msg) {
mediator.send(msg, this);
}
//
public void notify(String msg) {
System.out.println("同事1接收到信息:"+msg);
}
}
具体同事类2:
package com.pattern.Mediator.Colleague;
import com.pattern.Mediator.Mediator.Mediator;
/**
* 具体同事类2
*
*/
public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
public void send(String msg) {
mediator.send(msg, this);
}
public void notify(String msg) {
System.out.println("同事2接收到信息:" + msg);
}
}
3.客户端(Client)中用法:
设计分析:展示发起请求、命令调用、命令接受、命令执行的实现 。
代码如下:
package com.pattern.Mediator.client;
import com.pattern.Mediator.Colleague.ConcreteColleague1;
import com.pattern.Mediator.Colleague.ConcreteColleague2;
import com.pattern.Mediator.Mediator.ConcreteMediator;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建中介
ConcreteMediator mediator = new ConcreteMediator();
// 让个同事都认识中介
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
// 让中介认识两个同事
mediator.setConcreteColleague1(concreteColleague1);
mediator.setConcreteColleague2(concreteColleague2);
// 两个同事之间的通信,都通过中介转发
concreteColleague1.send("1加2等于几?");
concreteColleague2.send("等于3");
}
}
6.运行结果
结果分析: 同事1通过中介者发送信息,同事2接收信息到信息后,再通过中介者将信息发送给同事1。
同事2接收到信息:1加2等于几?
同事1接收到信息:等于3
7.源码下载
本文示例代码下载地址:点击下载
三.总结:
中介者模式为了降低多个对象之间通信的复杂性,该模式提供了一个中介类,用于处理不同类之间的通信,从而降低多个类之间的耦合度,使代码易于维护。
1.中介者模式的优点
- 降低了Colleague类之间的耦合度,可以修改Colleague类的同时不影响其他Colleague类。
2.中介者模式的缺点
- 随着Colleague对象的增多,中介者会庞大,变得复杂难以维护