一、定义
用一个中介者对象封装一系列的对象交互,中介者使各对象之间不需要显示地相互作用,各对象之间只要跟中介者对象关联,从而使各对象之间的耦合降低,并且能独立地改变它们之间的交互。中介者设计模式属于行为设计模式。为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。
角色:
抽象中介者Mediator:抽象中介者角色,定义一个接口,用于各同事之间通信。(谁说的,说了什么)
具体中介者:有部分业务逻辑,用于协商各个同事。(A说的,中介要通知B。B说了,A中介要通知A)
抽象同事Colleague:拥有抽象中介者对象的引用,不知道其它同事。(同事类只与中介交互)
具体同事:主要有一个方法,向中介者对象发送消息,并且接收消息。
推荐一篇无与伦比的好博文:设计模式(十四)中介者模式,作者:刘望舒
二、优缺点
优点
符合迪米特原则(最少知道原则),将原有的一对多的依赖变成了一对一的依赖,降低类间的耦合。(以前租房人需要知道多个房东,房东也要知道多个租房人,现在变成了房东和租房人都只需要知道一个中介就可以了,他们之间的通信由中介结构调用)
缺点
可以很明显的知道,中介者为了协调各个同事类之间的通信,那么需要知道这些同事类的引用。如果同事类过多的话,那么中介者类将会变得非常庞大,难以维护。
三、一个比较拙劣的例子
现在有 租房人小王、租房人小明、房东小李、中介结构。
小王、小李向中介结构发出需求,中介结构把需求发给房东小李。
小李向中介机构发出响应,中介机构把房东的响应告知给租房人们。
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之间 * 房东小李得到消息:我要租房子,房租要有空调 * 租房人小王得到消息:我有几间屋子急着出租 * 租房人小明得到消息:我有几间屋子急着出租 */ } }