中介者模式定义
用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式结构图
中介者模式角色介绍
抽象中介者:Mediator,它定义一个接口,该接口用于与各同事对象之间进行通信。
具体中介者:ConcreteMediator,它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。
抽象同事类:Colleague,它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
具体同事类:ConcreteColleague,它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。
中介者模式结构代码
抽象中介者:
public interface Mediator {
//定义各个同事对象与中介者进行交互的方法
void execute(String param);
}
具体中介者:
public class ConcreteMediator implements Mediator {
private ConcreteColleagueA concreteColleagueA;
private ConcreteColleagueB concreteColleagueB;
public void execute(String param) {
if ("toA".equals(param)){
concreteColleagueA.methodA();
}else if ("toB".equals(param)){
concreteColleagueB.methodB();
}else {
System.out.println("nothing");
}
}
public ConcreteColleagueA getConcreteColleagueA() {
return concreteColleagueA;
}
public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
this.concreteColleagueA = concreteColleagueA;
}
public ConcreteColleagueB getConcreteColleagueB() {
return concreteColleagueB;
}
public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
this.concreteColleagueB = concreteColleagueB;
}
}
抽象同事类:
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
//定义公共方法,与中介者通信
public void optionMediatorMethod(String param){
mediator.execute(param);
}
}
具体同事类A:
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
public void methodA(){
System.out.println("methodA");
}
}
具体同事类B:
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
public void methodB(){
System.out.println("methodB");
}
}
客户端:
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA concreteColleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB concreteColleagueB = new ConcreteColleagueB(mediator);
mediator.setConcreteColleagueA(concreteColleagueA);
mediator.setConcreteColleagueB(concreteColleagueB);
//执行具体同事类A的逻辑
concreteColleagueA.methodA();
//发送通知给中介者类
concreteColleagueA.optionMediatorMethod("toB");
//执行具体同事类B的逻辑
concreteColleagueB.methodB();
//发送通知给中介者类
concreteColleagueB.optionMediatorMethod("toA");
}
}
中介者模式运行机制
所有同事类对象持有中介者对象,中介者对象持有所有同事类对象;
所有同事类对象都与中介者交互,中介者接收到同事类对象的调用之后,按照相关业务逻辑选择调用另一个同事类对象。
中介者模式解决的核心问题
中介者模式解决了各个对象之间纷繁复杂的依赖关系,统一与中介者进行依赖,实现各个对象直接解耦,实现最小化依赖,也是对迪米特法则的具体实现。