中介者模式(MediatorPattern)
属于行为型模式
的一种,用一个中介对象
来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
在我们的生活中处处充斥着中介者,比如租房、买房、出国留学、找工作、旅游等等可能都需要那些中介者的帮助,同时我们也深受其害,高昂的中介费,虚假信息。 在地球上最大的中介者就是联合国了
,它主要用来维护国际和平与安全、解决国际间经济、社会、文化和人道主义性质的问题。国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌人,熟话说没有永远的朋友,也没有永远的敌人,只有永远的利益!所以国与国之间的关系同样会随着时间、环境因为利益而发生改变。在我们软件的世界也同样如此,对象与对象之间存在着很强、复杂的关联关系,如果没有类似于联合国这样的“机构”会很容易出问题的,譬如:
1、 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
2、 对象之间的连接增加会导致对象可复用性降低。
3、 系统的可扩展性低。增加一个新的对象,我们需要在其相关连的对象上面加上引用,这样就会导致系统的耦合性增高,使系统的灵活性和可扩展都降低。
在前面我就知道如果两个类不必彼此通信,那么这两个类就不应当发生直接关联的关系。如果其中一个类需要调用另一个类中的方法,我们可以通过第三方来转发这个调用。所以对于关系比较复杂的系统,我们为了减少对象之间的关联关系,使之成为一个松耦合系统,我们就需要使用中介者模式。
通过中介者模式,我们可以将复杂关系的网状结构变成结构简单的以中介者为核心的星形结构,每个对象不再和它与之关联的对象直接发生相互作用,而是通过中介者对象来另一个对象发生相互作用。
UML结构图
模式结构
以租房为例,这里中介机构充当租房者与房屋所有者之间的中介者。UML结构图:
UML图如下:
1.定义抽象中介者
interface Mediator {
/**
* 让对象之间通讯
* @param content 传递的内容
* @param person 传递的对象
*/
void contact(String content, AbstractPerson person);
}
2.定义抽象同事类 AbstractPerson
abstract class AbstractPerson {
protected String name;
protected Mediator mediator;
AbstractPerson(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void receiveMessage(String msg);
}
3.分别定义 房东
和 租客
类,继承抽象同事类
class HouseOwner extends AbstractPerson {
HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
public void contact(String message) {
mediator.contact(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("房主:" + name + ",获得信息:" + message);
}
}
class Tenant extends AbstractPerson {
Tenant(String name, Mediator mediator) {
super(name, mediator);
}
public void contact(String message) {
mediator.contact(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("租客:" + name + ",获得信息:" + message);
}
}
4.创建具体中介者,抽象的实现,用来协调各个同事之间调用
class MediatorStructure implements Mediator {
private HouseOwner houseOwner;
private Tenant tenant;
public HouseOwner getHouseOwner() {
return houseOwner;
}
public void setHouseOwner(HouseOwner houseOwner) {
this.houseOwner = houseOwner;
}
public Tenant getTenant() {
return tenant;
}
public void setTenant(Tenant tenant) {
this.tenant = tenant;
}
@Override
public void contact(String message, AbstractPerson person) {
//如果是房主,则租房者获得信息
if (person == houseOwner) {
tenant.receiveMessage(message);
} else {
//反正则是房主获得信息
houseOwner.receiveMessage(message);
}
}
}
5.创建客户端测试
public class Client {
public static void main(String[] args) {
//一个房主、一个租房者、一个中介机构
MediatorStructure mediator = new MediatorStructure();
HouseOwner owner = new HouseOwner("小唐", mediator);
Tenant tenant = new Tenant("小李", mediator);
mediator.setHouseOwner(owner);
mediator.setTenant(tenant);
tenant.contact("房东您好,请问还有三室两厅出粗吗.....");
owner.contact("还有!你需要租吗?");
}
}
6.运行结果
房主:小唐,获得信息:房东您好,请问还有三室两厅出粗吗.....
租客:小李,获得信息:还有!你需要租吗?
优点
缺点
Mediator模式
在事件驱动类应用中比较多,例如聊天、消息传递等等,需要有一个MessageMediator,专门负责request/reponse之间任务的调节。
JDK的具体应用:
- java.util.Timer
- java.util.concurrent.Executor#execute()
- java.util.concurrent.ExecutorService#submit()
- java.lang.reflect.Method#invoke()
参考文献:http://www.cnblogs.com/JsonShare/p/7263876.html
全文代码:https://gitee.com/battcn/design-pattern/tree/master/Chapter15/battcn-mediator