简介
中介者模式:定义一个对象来封装一系列对象的交互,中介者模式使各个对象之间不需要相互引用,从而使得其松耦合,而且用户可以独立地改变他们之间的交互。
简单讲解:
1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互。
中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2)中介者模式属于行为型模式,使代码易于维护。
3)比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到来中间人的作用。
结构图如下:
角色
通过上面结构图,可以看出中介者中包含的角色:
1)Mediator 就是抽象中介者,定义类同事对象到中介者对象的接口。
2)Colleague 是抽象同事类。
3)ConcreteMediator 具体的中介者对象,实现抽象方法,他需要知道所有的具体的同事类,即以一个集合来管理HashMap,并接收某个同事对象消息,完成相应的任务。
4)ConcreteColleague 具体的同事类,会有很多,每个同事只知道自己的行为,而不了解其他同事类的行为(方法),但是他们都是依赖中介者对象。
简单示例
1.创建一个简单的中介者对象,设置为一个接口。
public interface IMediator {
public void react(AbstractColleague c);
}
2.创建抽象同事类,包含一个中介者的实例。为了能够定义构造函数,将它写成了一个抽象类。
public abstract class AbstractColleague {
protected IMediator mediator;
public AbstractColleague(IMediator m) {
mediator = m;
}
public final IMediator getMediator() {
return mediator;
}
}
3.创建具体的中介者对象,实现中介者接口。
public class ControllerMediator implements IMediator {
private ViewColleague viewColleague;
private ModelColleague modelColleague;
public ControllerMediator setView(ViewColleague v){
viewColleague = v;
return this;
}
public ControllerMediator setModel(ModelColleague m){
modelColleague = m;
return this;
}
@Override
public void react(AbstractColleague c) {
if (c instanceof ViewColleague) {
String data = modelColleague.whenClick();
viewColleague.display(data);
} else if (c instanceof ModelColleague) {
viewColleague.prepareShutdown();
} else {
System.out.println("Not Supported Class: " + c.getClass().getName());
}
}
}
4.定义两个具体的协同者,他们直接需要进行某些交互的动作,但是由于中介者的存在,他们不必互相了解,只要将自身的变化告诉中介者即可。
public class ViewColleague extends AbstractColleague {
public ViewColleague(IMediator m) {
super(m);
}
public void mockClick() {
System.out.println("View got a click action.");
getMediator().react(this);
}
public void display(String data) {
System.out.println("View got " + data + " from model.");
}
public void prepareShutdown(){
System.out.println("View knows that: Model gonna shutdown, backup your data.");
}
}
public class ModelColleague extends AbstractColleague {
public ModelColleague(IMediator m) {
super(m);
}
public String whenClick(){
System.out.println("Model should return some data to view.");
return "data";
}
public void shutdown(){
System.out.println("Model will shutdown in 5 sec.");
getMediator().react(this);
}
}
5.Client(Main验证)
public class MediatorMain {
public static void main(String[] args) {
ControllerMediator controller = new ControllerMediator();
ViewColleague view = new ViewColleague(controller);
ModelColleague model = new ModelColleague(controller);
controller.setView(view).setModel(model);
view.mockClick();
model.shutdown();
}
}