简介:中介者模式用一个中介对象来保存其他对象引用,所有对象之间的调用处理都直接与中介者交互。这样对象之间不需要显示耦合在一起。常见使用场景如MVC中,所有请求及处理都和控制器交互等。
代码实现及测试如下:
/**
* 中介者接口,定义对象注册方法和对象之间交互方法
* @author dedu
*
*/
public interface Mediator {
/**各个子对象注册进中介者
*/
void register(String name, Subject sub);
/**中介者调用相应子对象处理逻辑
*/
void handle(String obj);
}
/**
* 中介者,内部保留一个存储各个子对象的容器,方便子对象交互时调用
* @author dedu
*
*/
public class ConcreteMediator implements Mediator{
private Map<String, Subject> cache = new HashMap<>();
/**
* 参与交互的对象都需要注册到中介者,否则找不到相应对象进行处理
*/
@Override
public void register(String name, Subject sub) {
cache.put(name, sub);
}
@Override
public void handle(String obj) {
Subject sub = cache.get(obj);
if (null != sub) {
sub.handle();
} else {
System.out.println("稍等,尚未找到处理者");
}
}
}
/**
* 对象父接口,定义子对象的行为
* @author dedu
*
*/
public interface Subject {
/**处理其他子对象的调用
*/
void handle();
/**自己业务处理
*/
void display();
}
/**
* 子对象实现者A,内部需引用一个中介者,并将自己注册到中介者中,以提供服务
* @author dedu
*
*/
public class SubjectA implements Subject {
private Mediator mediator;
public SubjectA(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register(this.getClass().getSimpleName(), this);
}
@Override
public void handle() {
System.out.println("A:处理其他地方调用业务");
}
@Override
public void display() {
System.out.println("A:正在处理自己的业务");
/**
* 这里如果需要其他对象支持,直接向中介者发送请求
*/
mediator.handle("SubjectB");
}
}
/**
* 子对象实现者B,内部需引用一个中介者,并将自己注册到中介者中,以提供服务
* @author dedu
*
*/
public class SubjectB implements Subject {
private Mediator mediator;
public SubjectB(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register(this.getClass().getSimpleName(), this);
}
@Override
public void handle() {
System.out.println("B:处理其他地方调用业务");
}
@Override
public void display() {
System.out.println("B:正在处理自己的业务");
/**
* 这里如果需要其他对象支持,直接向中介者发送请求
*/
mediator.handle("SubjectC");
}
}
/**
* 子对象实现者C,内部需引用一个中介者,并将自己注册到中介者中,以提供服务
* @author dedu
*
*/
public class SubjectC implements Subject {
private Mediator mediator;
public SubjectC(Mediator mediator) {
super();
this.mediator = mediator;
mediator.register(this.getClass().getSimpleName(), this);
}
@Override
public void handle() {
System.out.println("C:处理其他地方调用业务");
}
@Override
public void display() {
System.out.println("C:正在处理自己的业务");
}
}
测试:
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Subject subA = new SubjectA(mediator);
Subject subB = new SubjectB(mediator);
Subject subC = new SubjectC(mediator);
subA.display();
}