您的位置:首页 > 其它

责任链模式(行为型)

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抽象类:

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);
}
}


目录结构:



输出结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: