思考问题:(模拟班游集体请假),学校规定:对于班游,学生提交的申请表,必须经过辅导员、系主任、院长、校长签名确认才能出游,现在由你来设计该业务模型模拟该需求,应该如何设计?
解答:很直观的一种想法:我直接设计一个学生类、一个申请单类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);
}
}
目录结构:
输出结果:
时间: 2024-10-19 01:35:36