责任链模式(行为型)
来源:互联网 发布:mac创建u盘启动盘 编辑:程序博客网 时间:2024/06/07 03:12
思考问题:(模拟班游集体请假),学校规定:对于班游,学生提交的申请表,必须经过辅导员、系主任、院长、校长签名确认才能出游,现在由你来设计该业务模型模拟该需求,应该如何设计?
解答:很直观的一种想法:我直接设计一个学生类、一个申请单类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); }}
目录结构:
输出结果:
1 0
- 责任链模式(行为型)
- 行为型-责任链模式(Responsibility)
- 责任链模式(行为型)
- 行为型模式-----责任链模式(chain of responsibility)
- 设计模式--责任链模式ChainOfResponsibility(行为型)
- (行为型模式六)责任链模式
- 行为型:设计模式之责任链模式(十三)
- Java设计模式(行为型)之-责任链模式
- Java设计模式(17)行为型:责任链模式
- 设计模式--行为型--责任链模式
- 行为型模式----责任链模式
- 行为型模式-责任链模式
- 行为型模式--责任链模式
- 行为型设计模式-责任链模式
- 行为型设计模式-责任链模式
- 11-行为型-责任链模式
- 行为型之责任链模式
- 责任链模式 - 行为模式
- [leetcode] 93. Restore IP Addresses 解题报告
- dedecms调用文章循环次数并判断
- Linux/Unix inode、vnode、dentry、file、进程表、文件表(中)
- iOS 集成环信(四)
- 连续子数组的最大和
- 责任链模式(行为型)
- 使用蓝牙mic录音
- Servlet相关知识
- 视频教程
- [转][DSP]关于tsk和mbx
- 【转】DSP/BIOS中的SEM
- 从Cfgdemo项目来分析协议栈的启动
- Y U V与Y,Pb,Pr与 Y, Cb,Cr有什么区别?([转载]
- ITU BT 601与ITU BT656 的区别[转]