1.定义
- 将对象之间的n:m关系,转换为中介者与其他对象的1:n关系,达到松散耦合的目的
- 中介者需要知道每个Colleague对象,每个Colleague对象也需要直到中介,Colleague对象通过中介者交互数据
2.UML类图
- 角色介绍
AbstractMediator : 抽象中介者,定义传递同事对象到中介的接口
ConcreteMediator : 具体中介者,传递同事对象之间的数据
AbstractColleague : 抽象同事类,只与中介进行交互,不知道其他同事对象
ConcreteColleagueA : 具体同事类
ConcreteColleagueB : 具体同事类 - 要点
抽象中介者、抽象同事 两者我中有你,你中有我,达到互相通信的目的。
同事只与中介交换数据,不知道其他同事类的存在。
3.UML示例代码
/**
* Copyright (C), 2015-2019
* FileName: AbstractMediator
* Author: wei.zheng
* Date: 2019/10/25 22:17
* Description: 抽象中介者, 持有具体同事的引用
*/
public abstract class AbstractMediator {
protected ConcreteColleagueA colleagueA;
protected ConcreteColleagueB colleagueB;
public abstract void method();
public void setColleagueA(ConcreteColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public void setColleagueB(ConcreteColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
}
/**
* Copyright (C), 2015-2019
* FileName: ConcreteMediator
* Author: wei.zheng
* Date: 2019/10/25 22:22
* Description: 具体中介者
*/
public class ConcreteMediator extends AbstractMediator {
@Override
public void method() {
colleagueA.action();
colleagueB.action();
}
}
/**
* Copyright (C), 2015-2019
* FileName: AbstractColleague
* Author: wei.zheng
* Date: 2019/10/25 22:18
* Description: 抽象同事类,持有中介对象的引用,可以调用中介对象的方法,达到通知中介者的目的
*/
public abstract class AbstractColleague {
protected AbstractMediator mediator;
public AbstractColleague(AbstractMediator mediator){
this.mediator = mediator;
}
public abstract void action();
}
/**
* Copyright (C), 2015-2019
* FileName: ConcreteColleagueA
* Author: wei.zheng
* Date: 2019/10/25 22:19
* Description: 具体同事A
*/
public class ConcreteColleagueA extends AbstractColleague {
public ConcreteColleagueA(AbstractMediator mediator) {
super(mediator);
}
@Override
public void action() {
System.out.println("ColleagueA 将信息交给中介者处理");
}
}
/**
* Copyright (C), 2015-2019
* FileName: ConcreteColleagueB
* Author: wei.zheng
* Date: 2019/10/25 22:21
* Description: 具体同事B
*/
public class ConcreteColleagueB extends AbstractColleague {
public ConcreteColleagueB(AbstractMediator mediator) {
super(mediator);
}
@Override
public void action() {
System.out.println("ColleagueB 将信息交给中介者处理");
}
}
/**
* Copyright (C), 2016-2020
* FileName: Client
* Author: wei.zheng
* Date: 2019/12/24 9:36
* Description: 中介者模式用户类
*/
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.setColleagueA(colleagueA);
mediator.setColleagueB(colleagueB);
mediator.method();
}
}
// 运行结果
2019-12-24 09:41:29.917 22610-22610/? I/System.out: ColleagueA 将信息交给中介者处理
2019-12-24 09:41:29.918 22610-22610/? I/System.out: ColleagueB 将信息交给中介者处理
4.总结
中介者模式,将同事对象之间的网型结构,转换为以中介为中心的星型结构。
优点:对复杂依赖关系进行解耦,使逻辑结构清晰
缺点:类的膨胀在此模式表现的并不明显,只增加了中介者。
权衡利弊,若依赖关系很简单,则无需使用此模式,避免使简单问题复杂化。