责任链模式(行为型)

来源:互联网 发布:mac创建u盘启动盘 编辑:程序博客网 时间:2024/06/07 03:12

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


解答:很直观的一种想法:我直接设计一个学生类、一个申请单类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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百益健身怎么办卡 如果涂色没有画笔怎么办 打混凝土下雨了怎么办 下雨跑马拉松怎么办 儿童坐飞机忘带证件怎么办 我飞机油油超标怎么办 飞机超规格行李怎么办 打蜡后下雨了怎么办 飞机起飞耳朵不舒服怎么办 宝宝脸上口水疹怎么办 婴儿身上长癣怎么办 婴儿下巴口水藓怎么办 婴儿嘴边长癣怎么办 婴儿脸上口水癣怎么办 嘴巴旁边长癣怎么办 美团机票不出票怎么办 东方航空会员锁定怎么办 大众车烧机油怎么办 大众cc烧机油怎么办 叫外卖给差评被打怎么办 发现宿舍被盗后怎么办 知了猴变黑了怎么办 婴儿仙人掌的刺怎么办 仙人掌刺扎进皮肤里怎么办 被仙人掌的小细绒刺扎到怎么办 值机截止了怎么办 社保卡消磁了怎么办 住宾馆没身份证怎么办 社保卡电话错误怎么办 没住过酒店怎么办 上海合规网约车证件怎么办 取票没有身份证怎么办 买车票没有身份证怎么办 登机身份证丢了怎么办 飞机没带身份证怎么办 上飞机没带身份证怎么办 机场没带身份证怎么办 儿童坐飞机没有户口本怎么办 不需要行李托运化妆品怎么办 坐飞机被限制了怎么办 坐飞机没买保险怎么办