模式系列16"/>
设计模式系列16
所谓责任落实到位,落实到人,就是要找对特定事情有处理权限的人。
我们以法院为例子,小事情就在基层人民法院处理了,大一点的事情就找地市级的中级法院,如果事情闹大的就省级的高级人民法院,如果这事件特别重大,那就是最高人民法院了。
所以我们看下四个级别:
最高人民法院 > 高级人民法院 > 中级人民法院 > 基层人民法院
那么问题来了,当年窦娥冤情换成现在是归谁管呢?可以跳级跑去告御状吗?
代码实现
现在我们先抽象出一个案例的基本元素。
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;}@Overridepublic int getLevel() {return level;}@Overridepublic 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);}@Overridepublic void response(ICase iCase) { System.out.print("基层法院:处理案情" + iCase.getRequest());}
}
接着是中级法院
public class MidCourt extends Court {public MidCourt() {super(MID_LEVEL);}@Overridepublic void response(ICase iCase) { System.out.print("中级法院:处理案情" + iCase.getRequest());}
}
然后是高级
public class HighCourt extends Court {public HighCourt() {super(HIGH_LEVEL);}@Overridepublic void response(ICase iCase) {System.out.print("高级法院:处理案情" + iCase.getRequest());}
}
最后是终极
public class HighCourt extends Court {public HighCourt() {super(TOP_LEVEL);}@Overridepublic 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);}
}
我们的最终审批写好了,从本地的法院开始处理!
但我们知道最后没人处理得了,所有只有六月飞雪
了。
类图
后记
在写服务器的时候,我们经常会写一些过滤的操作,其中就有责任链的影子。
我们的责任链的好处是减低了耦合度,一个对象无需要关心到底接下来给谁,只需要专心处理自己的事情就好了。
不过有个问题,就是不能保证我们的请求被处理,例如我们的窦娥。
另外,责任链调试不是很方便。
更多推荐
设计模式系列16
发布评论