一个请假案例弄懂责任链模式
2017-09-18 13:09
169 查看
1、什么是责任链模式?
2、应用场景?
3、UML类图描述,以生活当中我们请假为例。
先来分析一波这个类图,首先我们有两个抽象类,用来定义员工和领导的。这样当我们需要增加一个员工或者领导的时候不需要在一个一个的添加,减少了代码量,提高了扩展性,而且对于领导这个抽象类里边定义了一个抽象方法,这个方法专门用来处理员工的请假任务,还有一个方法,用来指定领导之间的关系。
他的处理流程是,如果请假天数小于7天,组长直接处理,如果大于7天并且小于15天,交给经理来处理,如果大于15天交给总经理来处理,这样一直链接下去。
下面直接上代码:
员工抽象类:
引用块内容
领导抽象类:
员工类:
组长类:
经理类:
总经理类:
测试类:
定义:将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能处理则处理,如果不能则传递给链上的下一个对象。
2、应用场景?
场景: ----打牌时轮流出牌 ----接力赛跑 ----大学中,奖学金审批 ----公司中公文审批
3、UML类图描述,以生活当中我们请假为例。
先来分析一波这个类图,首先我们有两个抽象类,用来定义员工和领导的。这样当我们需要增加一个员工或者领导的时候不需要在一个一个的添加,减少了代码量,提高了扩展性,而且对于领导这个抽象类里边定义了一个抽象方法,这个方法专门用来处理员工的请假任务,还有一个方法,用来指定领导之间的关系。
他的处理流程是,如果请假天数小于7天,组长直接处理,如果大于7天并且小于15天,交给经理来处理,如果大于15天交给总经理来处理,这样一直链接下去。
下面直接上代码:
员工抽象类:
引用块内容
package com.bjsxt.pattern.chain; //员工抽象类 public abstract class EmpAbstract { protected String name; //请假天数 protected int dates; //请假原因 protected String why; public EmpAbstract(String name, int dates, String why) { super(); this.name = name; this.dates = dates; this.why = why; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDates() { return dates; } public void setDates(int dates) { this.dates = dates; } public String getWhy() { return why; } public void setWhy(String why) { this.why = why; } @Override public String toString() { return "EmpAbstract [name=" + name + ", dates=" + dates + ", why=" + why + "]"; } }
领导抽象类:
package com.bjsxt.pattern.chain; /** * 责任链模式 * 领导的抽象类 * * */ public abstract class Leader { protected Leader nextLeader; //领导的名字 protected String name; //提供一个构造下一个领导的方法 public void setNextLeader(Leader nextLeader){ this.nextLeader = nextLeader; } //提供一个抽象方法用来处理请求 protected abstract void requestHandler(EmpAbstract emp); public Leader(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
员工类:
package com.bjsxt.pattern.chain; //员工类 public class Emp extends EmpAbstract{ public Emp(String name, int dates, String why) { super(name, dates, why); } }
组长类:
package com.bjsxt.pattern.chain; //组长类 public class ZuZhang extends Leader{ public ZuZhang(String name) { super(name); } @Override protected void requestHandler(EmpAbstract emp) { if (emp.dates<=7) { System.out.println("领导:"+name+"准假!"); }else{ //如果大于七天,组长不能处理,则交给他的上级领导处理 nextLeader.requestHandler(emp); } } }
经理类:
package com.bjsxt.pattern.chain; public class JingLi extends Leader{ public JingLi(String name) { super(name); } @Override protected void requestHandler(EmpAbstract emp) { if (emp.dates>7 && emp.dates<15) { System.out.println("领导:"+name+"准假!"); }else{ //如果处理不了,交给下一个领导处理 nextLeader.requestHandler(emp); } } }
总经理类:
package com.bjsxt.pattern.chain; public class Manager extends Leader{ public Manager(String name) { super(name); } @Override protected void requestHandler(EmpAbstract emp) { if (emp.dates>15 && emp.dates<30) { System.out.println("领导:"+name+"准假!"); }else{ System.out.println(emp.name+"请假这么多天,想辞职?"); } } }
测试类:
package com.bjsxt.pattern.chain; public class TestClient { public static void main(String[] args) { //构造一个员工 EmpAbstract emp = new Emp("张三",8,"回家探亲!"); //构造上级领导,小组长 Leader zuzhang = new ZuZhang("张无忌"); //构造经理 Leader jingli = new JingLi("张翠山"); //构造经理的上级 Leader manager = new Manager("张三丰"); //设置他们之间的关系 zuzhang.setNextLeader(jingli); jingli.setNextLeader(manager); //处理请假 zuzhang.requestHandler(emp); } }
相关文章推荐
- 一个案例带你弄懂类的继承方式对子类对外访问属性影响以及static遇到继承
- 用 HPjtune 分析 GC 日志(一个实际案例的诊断过程)
- 需求的分析,涉及,测试 - 一个案例
- 一个可供参考的Java高并发异步应用案例
- JEECG社区 一个微信教育站点案例源代码分享
- 最近用hibernate3+spring2.5+freemarker2.4做了一个案例出现错误!
- 一个基于Mule的企业服务总线的案例
- 日志分析一个案例
- 沟通中的思维模式:真实案例--做一个这样的 APP 要多久?
- 一个基于TensorFlow的简单故事生成案例:带你了解LSTM
- Spring+SpringMVC+Mybatis集成一个小的案例
- 解析一个通过添加本地分区索引提高SQL性能的案例
- 用Access作为后台数据库支撑,书写一个C#写入记录的案例
- [Oracle] 一个通过添加本地分区索引提高SQL性能的案例
- 一个表达式计算案例的设计和实现!〈转贴〉
- struts拦截器作用及一个案例
- Hibernate继承映射--每个子类一个数据表的实现案例
- UML简单介绍(十三)——一个活动图案例的完整解析
- 责任链模式(chain)—员工请假
- 谁让我们无功而返(一个案例分析)