责任链模式(行为型)
2016-05-07 14:49
555 查看
思考问题:(模拟班游集体请假),学校规定:对于班游,学生提交的申请表,必须经过辅导员、系主任、院长、校长签名确认才能出游,现在由你来设计该业务模型模拟该需求,应该如何设计?
解答:很直观的一种想法:我直接设计一个学生类、一个申请单类RequestNote、一个辅导员类、一个系主任类、一个院长类、一个校长类,然后为每个类添加审核方法verify(RequestNote rn);
然后设定规则:
1. 当辅导员审核通过就调用系主任的verify方法,不通过就返回不再向下调用。
2. 系主任审核通过就调用院长verify方法,否则不再向下调用;
3. 依次类推;
很好,这已经是接近责任链模式了,因为已经形成了一条链;
可优化一下,你会发现上面辅导员类、系主任类、院长类和校长类都有一个公共的verify方法和下一个处理类的引用,为了规范和结构清晰,我们是不是应该设计一个抽象类,添加verify抽象方法和下一个处理类的引用,让子类继承呢?
但是下一个处理类怎么表示?你会发现除了学生,其他人的身份都相似都是领导Leader,所以设计一个Leader类,构造函数中传入下一个处理者的对象,添加一个verify方法和一个Leader引用(代表下一个处理类)
学生类的submitReq方法中调用一个Leader(辅导员)的verify方法,表示学生向辅导员提交申请(构造辅导员时需要先传入系主任对象,构造系主任时需要传入院长对象,构造院长时需要传入校长对象);
实例代码:
Leader抽象类:
辅导员类:
系主任类:
目录结构:
输出结果:
解答:很直观的一种想法:我直接设计一个学生类、一个申请单类RequestNote、一个辅导员类、一个系主任类、一个院长类、一个校长类,然后为每个类添加审核方法verify(RequestNote rn);
然后设定规则:
1. 当辅导员审核通过就调用系主任的verify方法,不通过就返回不再向下调用。
2. 系主任审核通过就调用院长verify方法,否则不再向下调用;
3. 依次类推;
很好,这已经是接近责任链模式了,因为已经形成了一条链;
可优化一下,你会发现上面辅导员类、系主任类、院长类和校长类都有一个公共的verify方法和下一个处理类的引用,为了规范和结构清晰,我们是不是应该设计一个抽象类,添加verify抽象方法和下一个处理类的引用,让子类继承呢?
但是下一个处理类怎么表示?你会发现除了学生,其他人的身份都相似都是领导Leader,所以设计一个Leader类,构造函数中传入下一个处理者的对象,添加一个verify方法和一个Leader引用(代表下一个处理类)
学生类的submitReq方法中调用一个Leader(辅导员)的verify方法,表示学生向辅导员提交申请(构造辅导员时需要先传入系主任对象,构造系主任时需要传入院长对象,构造院长时需要传入校长对象);
实例代码:
Leader抽象类:
package com.shusheng.chain.responsibility; public abstract class Leader { Leader leader = null;//下一个申请表审核者 //审核方法 public abstract boolean verify(RequestNote rn); }
辅导员类:
package com.shusheng.chain.responsibility; /**辅导员类*/ public class Instructor extends Leader{ public Instructor(Leader leader) { this.leader = leader;//下一个申请表审核者 } @Override public boolean verify(RequestNote rn) { System.out.println("我是辅导员,我审核通过!我将申请表提交给下一个处理者"); return leader.verify(rn); } }
系主任类:
package com.shusheng.chain.responsibility; /**系主任*/ public class DepartmentHead extends Leader{ public DepartmentHead(Leader leader) { this.leader = leader;//下一个申请表审核者 } @Override public boolean verify(RequestNote rn) { System.out.println("我是系主任,我通过该申请。我将申请表提交给下一个处理者"); return leader.verify(rn); } }
package com.shusheng.chain.responsibility; /**学院院长*/ public class Dean extends Leader { public Dean(Leader leader) { this.leader = leader;//下一个申请表审核者 } @Override public boolean verify(RequestNote rn) { System.out.println("我是院长,我同意该申请,我将申请表提交给下一个处理者"); return leader.verify(rn); } }
package com.shusheng.chain.responsibility; /**校长类*/ public class President extends Leader{ public President(Leader leader) { this.leader = leader;//下一个申请表审核者 } @Override public boolean verify(RequestNote rn) { System.out.println("我是校长,我批准通过!我将申请表提交给下一个处理者"); return true; } }
package com.shusheng.chain.responsibility; /**模拟申请表*/ public class RequestNote { }
package com.shusheng.chain.responsibility; /**学生把申请表提交给辅导员*/ public class Student { /**提交申请表*/ public boolean submitRequestNote(RequestNote rNote,Instructor instructor){ return instructor.verify(rNote); } }
package com.shusheng.chain.responsibility; public class ResponsibilityChainTest { public static void main(String[] args) { President president = new President(null);//校长 Dean dean = new Dean(president);//院长 DepartmentHead departmentHead = new DepartmentHead(dean);//系主任 Instructor instructor = new Instructor(departmentHead);//辅导员 RequestNote rn = new RequestNote();//申请表 Student student = new Student(); student.submitRequestNote(rn, instructor); } }
目录结构:
输出结果:
相关文章推荐
- Spring 4 MVC hello world 教程-完全基于XML(带项目源码)【超赞】
- Linux/Unix inode、vnode、dentry、file、进程表、文件表(中)
- 使用蓝牙mic录音
- 连续子数组的最大和
- A Simple LD_PRELOAD Tutorial
- iOS 视图抖动动画
- Linux块设备驱动: ramdisk
- jquery 扩展方法 hello world
- bzoj1067 降雨量
- linux sort命令
- MyEclipse10优化配置
- 中英文对照 —— 计算机编程
- [terminal]Terminal常用快捷键
- 剑指offer 面试题 (替换空格)(1)
- More Effective C++----(26)限制某个类所能产生的对象数量
- SlidingMenu 常用属性
- C++学习:string构造函数的bug
- bzoj1925 [Sdoi2010]地精部落
- Binder学习笔记(三)—— binder客户端是如何组织checkService数据的
- 斯坦福大学公开课 编程方法学 Karel the Robot 寻找中点问题解决