责任链模式(行为型)

思考问题:(模拟班游集体请假),学校规定:对于班游,学生提交的申请表,必须经过辅导员、系主任、院长、校长签名确认才能出游,现在由你来设计该业务模型模拟该需求,应该如何设计?
这里写图片描述


解答:很直观的一种想法:我直接设计一个学生类、一个申请单类RequestNote、一个辅导员类、一个系主任类、一个院长类、一个校长类,然后为每个类添加审核方法verify(RequestNote rn);
然后设定规则:
1. 当辅导员审核通过就调用系主任的verify方法,不通过就返回不再向下调用。
2. 系主任审核通过就调用院长verify方法,否则不再向下调用;
3. 依次类推;
很好,这已经是接近责任链模式了,因为已经形成了一条链;
可优化一下,你会发现上面辅导员类、系主任类、院长类和校长类都有一个公共的verify方法和下一个处理类的引用,为了规范和结构清晰,我们是不是应该设计一个抽象类,添加verify抽象方法和下一个处理类的引用,让子类继承呢?
但是下一个处理类怎么表示?你会发现除了学生,其他人的身份都相似都是领导Leader,所以设计一个Leader类,构造函数中传入下一个处理者的对象,添加一个verify方法和一个Leader引用(代表下一个处理类)
uml图
学生类的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值