一:中介者模式
在java开发中,很多时候对象与对象之间会有一定关联关系,可以这么说在java开发完全独立的对象是不存在的。
而在中介者模式中就是用一个专门的类来管理这些公共信息。
可以看出具体的的角色有:中介者以及各个对象
(1)中介者抽象:抽象出具体的行为
(2)中介者的实现:中介者的实现
(3)对象的抽象:提取出总多具体对象的公共信息
(4)对象的实现:具体的对象
二:代码
1.抽象中介者
package test;
/**
* 抽象中介者
* @author Owner
*
*/
public interface IMediator {
public void react(AbstractColleague c);
}
2.对象的抽象
package test;
/**
* 协同者
* @author Owner
*
*/
public abstract class AbstractColleague {
protected IMediator mediator;
public AbstractColleague(IMediator m) {
mediator = m;
}
public final IMediator getMediator() {
return mediator;
}
}
3.对象的实现
package test;
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);
}
}
package test;
/**
* 具体协同1
* @author Owner
*
*/
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.");
}
}
4.抽象的实现
package test;
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());
// you can also :
//throw new NotSupportedException();
}
}
}
5.测试
package test;
public class test {
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 change:
view.mockClick();
//model change:
model.shutdown();
}
}
三:说明
其实居于上面的几幅图,下面的代码我自己看的都蒙,完全不知所云,但是 我翻看了许多网上的资料等,都是以类似的方法去实现的。下面我就提出个人对于这个模式的一些理解吧:
在许多项目中,我们会看到许多的实体类继承一个BaseModel,其中这个BaseModel中存储了创建人,创建时间,修改人,修改时间这些所有的实体类都需要的信息。这里我们就可以看成抽象瞅公共信息了,但是当我们数据库修改了创建时间的支队名称,我们只需在BaseModel中修改就ok了。
其实在实际项目中,我们可以看到类似的继承,都是符合这种思想的。