中介者设计模式21
一、定义
用一个中介者对象封装一系列的对象交互,中介者使各对象之间不需要显示地相互作用,各对象之间只要跟中介者对象关联,从而使各对象之间的耦合降低,并且能独立地改变它们之间的交互。中介者设计模式属于行为设计模式。为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。
角色:
抽象中介者Mediator:抽象中介者角色,定义一个接口,用于各同事之间通信。(谁说的,说了什么)
具体中介者:有部分业务逻辑,用于协商各个同事。(A说的,中介要通知B。B说了,A中介要通知A)
抽象同事Colleague:拥有抽象中介者对象的引用,不知道其它同事。(同事类只与中介交互)
具体同事:主要有一个方法,向中介者对象发送消息,并且接收消息。
推荐一篇无与伦比的好博文:设计模式(十四)中介者模式,作者:刘望舒
二、优缺点
优点
符合迪米特原则(最少知道原则),将原有的一对多的依赖变成了一对一的依赖,降低类间的耦合。(以前租房人需要知道多个房东,房东也要知道多个租房人,现在变成了房东和租房人都只需要知道一个中介就可以了,他们之间的通信由中介结构调用)
缺点
可以很明显的知道,中介者为了协调各个同事类之间的通信,那么需要知道这些同事类的引用。如果同事类过多的话,那么中介者类将会变得非常庞大,难以维护。
三、一个比较拙劣的例子
现在有 租房人A、租房人B、房东C、中介结构。
A、B向中介结构发出需求,中介结构把需求发给房东C。
房东C向中介机构发出响应,中介机构把房东C的响应告知给租房人们。
package me.jay.designPattern;
/**
* Created by jay.zhou on 2018/6/19.
*/
public abstract class Person {
public Person(String name) {
this.name = name;
}
protected String name;
public String getName() {
return name;
}
/**
* 得到中介结构的答复
*
* @param message
*/
public void getMessage(String message){
System.out.println(name+"得到消息:"+message);
}
/**
* 向中介结构发出消息,比如发送租房子请求
*
* @param zhongJie 中介结构
* @param message 发出的消息
*/
public abstract void sendMessage(AbstractZhongJie zhongJie,String message);
}
/**
* 租房人小明
*/
class XiaoMing extends Person{
public XiaoMing(String name) {
super(name);
}
@Override
public void sendMessage(AbstractZhongJie zhongJie,String message) {
zhongJie.LatestNews(message,this);//"我要租房子,房租在500-800之间"
}
}
/**
* 租房人小王
*/
class XiaoWang extends Person{
public XiaoWang(String name) {
super(name);
}
@Override
public void sendMessage(AbstractZhongJie zhongJie,String message) {
zhongJie.LatestNews(message,this);//"我要租房子,房租要有空调"
}
}
/**
* 房东小李
*/
class XiaoLi extends Person{
public XiaoLi(String name) {
super(name);
}
@Override
public void sendMessage(AbstractZhongJie zhongJie,String message) {
zhongJie.LatestNews(message,this);//"我有几间屋子急着出租"
}
}
package me.jay.designPattern;
/**
* Created by jay.zhou on 2018/6/19.
*/
//抽象中介机构
public interface AbstractZhongJie {
/**
* 中介定义一个接口,让各个同事类之间进行通行
* 中介机构最新得到的消息
*/
void LatestNews(String message,Person person);
}
class Zhongjie implements AbstractZhongJie{
//中介机构中必须要知道不同的同事类
private XiaoWang xiaoWang;//租房人小王
private XiaoMing xiaoMing;//租房人小明
private XiaoLi xiaoLi;//房东小李
public void setXiaoWang(XiaoWang xiaoWang) {
this.xiaoWang = xiaoWang;
}
public void setXiaoMing(XiaoMing xiaoMing) {
this.xiaoMing = xiaoMing;
}
public void setXiaoLi(XiaoLi xiaoLi) {
this.xiaoLi = xiaoLi;
}
@Override
public void LatestNews(String message, Person person) {
if(person.getName().equals("租房人小王")){
//租房人小王发出信息,那么中介要把这个信息告诉房东小李
xiaoLi.getMessage(message);
}else if(person.getName().equals("租房人小明")){
//租房人小明发出信息,那么中介要把这个信息告诉房东小李
xiaoLi.getMessage(message);
}else if(person.getName().equals("房东小李")){
//如果是房东小李发出的消息,那么租房人们需要知道
xiaoWang.getMessage(message);
xiaoMing.getMessage(message);
}
}
public static void main(String[] args) {
XiaoMing xiaoMing = new XiaoMing("租房人小明");
XiaoWang xiaoWang = new XiaoWang("租房人小王");
XiaoLi xiaoLi = new XiaoLi("房东小李");
Zhongjie zhongjie = new Zhongjie();
zhongjie.setXiaoLi(xiaoLi);
zhongjie.setXiaoWang(xiaoWang);
zhongjie.setXiaoMing(xiaoMing);
xiaoMing.sendMessage(zhongjie,"我要租房子,房租在500-800之间");
xiaoWang.sendMessage(zhongjie,"我要租房子,房租要有空调");
xiaoLi.sendMessage(zhongjie,"我有几间屋子急着出租");
/**
* 运行结果:
* 房东小李得到消息:我要租房子,房租在500-800之间
* 房东小李得到消息:我要租房子,房租要有空调
* 租房人小王得到消息:我有几间屋子急着出租
* 租房人小明得到消息:我有几间屋子急着出租
*/
}
}