所谓责任落实到位,落实到人,就是要找对特定事情有处理权限的人。
我们以法院为例子,小事情就在基层人民法院处理了,大一点的事情就找地市级的中级法院,如果事情闹大的就省级的高级人民法院,如果这事件特别重大,那就是最高人民法院了。
所以我们看下四个级别:
最高人民法院 > 高级人民法院 > 中级人民法院 > 基层人民法院
那么问题来了,当年窦娥冤情换成现在是归谁管呢?可以跳级跑去告御状吗?
代码实现
现在我们先抽象出一个案例的基本元素。
public interface ICase {
public int getLevel();
public String getRequest();
}
我们的案子有冤情级别,和冤情内容。
接着我们来写我们的窦氏。
public class DouWomen implements ICase {
private int level; //案情级别
private String request;//案情内容
public DouWomen(int level, String request) {
this.level = level;
this.request = request;
}
@Override
public int getLevel() {
return level;
}
@Override
public String getRequest() {
return request;
}
}
我们的窦氏是一个背负了案子的女人,所有实现了这个案子Icase
接口。
接着我们来看下我们的法院基本情况
public abstract class Court {
protected static final int LOCAL_LEVEL = 1;
protected static final int MID_LEVEL = 2;
protected static final int HIGH_LEVEL = 3;
protected static final int TOP_LEVEL = 4;
private int level = 0;
private Court nextCourt;
public Court(int level) {
this.level = level;
}
public final void HandleMessage(ICase iCase) {
if (iCase.getLevel() == this.level) {
this.response(iCase);
} else {
if (this.nextCourt != null) {
this.nextCourt.HandleMessage(iCase);
} else {
System.out.println("六月飞雪");
}
}
}
public void setNextCourt(Court _handler) {
this.nextCourt = _handler;
}
public abstract void response(ICase iCase);
}
我们的法院有处理的级别,和如果超过当前级别对应的下一个更高级的nextCourt
,如果超过最大级别,没人处理得了,那就只有六月飞雪了。
然后我们的基层法院
public class LocalCourt extends Court {
public LocalCourt() {
super(LOCAL_LEVEL);
}
@Override
public void response(ICase iCase) {
System.out.print("基层法院:处理案情" + iCase.getRequest());
}
}
接着是中级法院
public class MidCourt extends Court {
public MidCourt() {
super(MID_LEVEL);
}
@Override
public void response(ICase iCase) {
System.out.print("中级法院:处理案情" + iCase.getRequest());
}
}
然后是高级
public class HighCourt extends Court {
public HighCourt() {
super(HIGH_LEVEL);
}
@Override
public void response(ICase iCase) {
System.out.print("高级法院:处理案情" + iCase.getRequest());
}
}
最后是终极
public class HighCourt extends Court {
public HighCourt() {
super(TOP_LEVEL);
}
@Override
public void response(ICase iCase) {
System.out.print("最高人民法院:处理案情" + iCase.getRequest());
}
}
有了这么长的铺垫,终于可以写审批了
public class Judgement {
public static void main(String[] args) {
DouWomen douWomen = new DouWomen(999, " 我好冤啊");
Court localCourt = new LocalCourt();
Court midCourt = new MidCourt();
Court highCourt = new HighCourt();
Court topCourt = new TopCourt();
localCourt.setNextCourt(midCourt);
midCourt.setNextCourt(highCourt);
highCourt.setNextCourt(topCourt);
topCourt.setNextCourt(null);
localCourt.HandleMessage(douWomen);
}
}
我们的最终审批写好了,从本地的法院开始处理!
但我们知道最后没人处理得了,所有只有六月飞雪
了。
类图
后记
在写服务器的时候,我们经常会写一些过滤的操作,其中就有责任链的影子。
我们的责任链的好处是减低了耦合度,一个对象无需要关心到底接下来给谁,只需要专心处理自己的事情就好了。
不过有个问题,就是不能保证我们的请求被处理,例如我们的窦娥。
另外,责任链调试不是很方便。