设计模式--责任链
Mark:关于责任链Demo。
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
类图:
请假--审批(转)
描述:
请假这个事情,相信每个人都不陌生。
我们公司是个相对很宽松的公司。
在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了。
如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了。
如果超过了2天,你就需要去找总经理了,工资当然也玩完了。
那么,对于我们来说,这个流程就是这样的。
请求类。(包括请假时间和请假理由)
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public class Request { private double day; private String reason; public Request(int _day, String _reason){ this.day = _day; this.reason = _reason; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } public double getDay() { return day; } public void setDay(double day) { this.day = day; } }
请假处理人。PM HR Manager 三个类。
首先:创建Boss抽象类。
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public abstract class Boss { //两个核心的方法 private String name; private Boss successor; public Boss(String _name){ this.name = _name; } public abstract boolean passRequest(Request request); public String getName() { return name; } public void setName(String name) { this.name = name; } public Boss getSuccessor() { return successor; } public void setSuccessor(Boss successor) { this.successor = successor; } }
PM,HR,Manager 继承Boss
PM类:
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public class PM extends Boss { public PM(String _name) { super(_name); } @Override public boolean passRequest(Request request) { System.out.println("i'm pm"); double day = request.getDay(); String reason = request.getReason(); if(day <= 0.5){ return true; } return getSuccessor().passRequest(request); } }
HR类:
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public class HR extends Boss { public HR(String _name) { super(_name); // TODO Auto-generated constructor stub } @Override public boolean passRequest(Request request) { System.out.println("i'm hr"); double day = request.getDay(); String reason = request.getReason(); if(day > 0.5 && day <= 2) return true; return getSuccessor().passRequest(request); } }
Manager类:
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public class Manager extends Boss { public Manager(String _name) { super(_name); // TODO Auto-generated constructor stub } @Override public boolean passRequest(Request request) { System.out.println("i'm manager"); double day = request.getDay(); String reason = request.getReason(); if("正当理由".equals(reason)) return true; return false; } }
测试类:
package pattern; /** * @author _Venom_ * @version 创建时间:2014年7月27日 下午7:01:14 */ public class TestClain { public static void main(String[] args) { Request request = new Request(3, "非正当理由"); Boss pm = new PM("pm"); Boss hr = new HR("hr"); Boss manager = new Manager("manager"); pm.setSuccessor(hr); hr.setSuccessor(manager); boolean pass = pm.passRequest(request); System.out.println(pass); } }