【Java设计模式】· 职责链模式(Chain of Responsibility)

来源:互联网 发布:如何建立网站域名 编辑:程序博客网 时间:2024/06/06 00:25

职责链模式:


1.觉得学过的东西如果不记下来就太浪费了,还会经常忘掉,于是乎开始写博客。我只是一个菜鸟程序员,但有一颗向往技术大牛的心。


2.职责链模式:当一个问题需要经过“重重考虑”才能给出结果时,这样的“重重考虑”的过程,需要用到职责链模式。职责链模式中,有多个负责不同职责的handler,当handlerA解决不了问题时,会交给handlerB,而如果handlerB也不能解决时,就会交给handlerC····以此类推,直到最后一个handler。


Handler : 责任人的父类

ConcreteHandler:责任人的具体类


3.例子: 学生要向学校请假,如果请假天数<3天,只需要老师批准,而3天<请假天数<7天则需要级长批准,7天以上的请假需要校长批准,这时候需要用到职责链模式。


首先新建一个Handler类,所有处理问题的人都是Handler的子类

package pers.reus.model.handler.impl;public abstract class Handler {//创建职责链的连接者protected Handler successor = null;//设置下一个处理的对象public void setSuccessor(Handler successor){this.successor = successor;}//获得下一个处理对象public Handler getSuccessor(){return successor;}/** * 处理学生请假的方法 * student 学生姓名 * day     请假天数 * **/public abstract String HandlerRequest(String student, int day);}


接下来分别创建 教师,级长,校长 三种责任人,他们都继承Handler


教师:

package pers.reus.model.handler;import pers.reus.model.handler.impl.Handler;public class Teacher extends Handler {public String HandlerRequest(String student, int day){//处理请假结果以String返回String msg = null;//请假少于3天,只需老师同意if(day <= 3){msg = "老师同意 " + student + " 请假 " + day + " 天";}else{//当存在下一个处理对象时,老师处理不了的请假交由下一个对象处理if(getSuccessor() != null){  System.out.println("老师无权同意 " + student + " 请假 " + day + " 天");return getSuccessor().HandlerRequest(student,day);}}//返回请假结果return msg;}}


级长:
package pers.reus.model.handler;import pers.reus.model.handler.impl.Handler;public class Prefect extends Handler{public String HandlerRequest(String student, int day) {//处理请假结果以String返回String msg = null;//请假少于7天,只需级长同意if(day <= 7){msg = "级长同意 " + student + " 请假 " + day + " 天";}else{//当存在下一个处理对象时,级长处理不了的请假交由下一个对象处理if(getSuccessor() != null){System.out.println("级长无权同意 " + student + " 请假 " + day + " 天");return getSuccessor().HandlerRequest(student,day);}}//返回请假结果return msg;}}


校长:

package pers.reus.model.handler;import pers.reus.model.handler.impl.Handler;public class SchoolMaster extends Handler{public String HandlerRequest(String student, int day) {//处理请假结果以String返回String msg = null;//请假大于7天,需要校长同意if(day > 7){msg = "校长同意 " + student + " 请假 " + day + " 天";}else{//当存在下一个处理对象时,校长处理不了的请假交由下一个对象处理if(getSuccessor() != null){System.out.println("校长无权同意 " + student + " 请假 " + day + " 天");return getSuccessor().HandlerRequest(student,day);}}//返回请假结果return msg;}}


最后,创建client类测试:

package pers.reus.model.client;import pers.reus.model.handler.Prefect;import pers.reus.model.handler.SchoolMaster;import pers.reus.model.handler.Teacher;import pers.reus.model.handler.impl.Handler;public class Client {public static void main(String[] args) {//创建 教师,级长,校长 三个类Handler teacher = new Teacher();          Handler prefect = new Prefect();          Handler schoolMaster = new SchoolMaster();                  //设置责任关系,教师无法处理交给级长,级长无法处理交给校长        teacher.setSuccessor(prefect);          prefect.setSuccessor(schoolMaster);                //模拟学生进行请假        String str = teacher.HandlerRequest("小明",8);                //输出请假结果        System.out.println(str);}}


0 0