责任链模式

来源:互联网 发布:四川广电网络投诉电话 编辑:程序博客网 时间:2024/06/10 21:34

一、定义

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

二、UML类图

这里写图片描述
Client:客户端

Handler:抽象处理者

ConcreteHandler:具体处理者

简单实现:

//抽象处理者public abstract class Handler {    /**     * 持有后继的责任对象     */    protected Handler successor;    /**     * 示意处理请求的方法,虽然这个示意方法是没有传入参数的     * 但实际是可以传入参数的,根据具体需要来选择是否传递参数     */    public abstract void handleRequest();    /**     * 取值方法     */    public Handler getSuccessor() {        return successor;    }    /**     * 赋值方法,设置后继的责任对象     */    public void setSuccessor(Handler successor) {        this.successor = successor;    }}
//具体处理者public class ConcreteHandler extends Handler {    /**     * 处理方法,调用此方法处理请求     */    @Override    public void handleRequest() {        /**         * 判断是否有后继的责任对象         * 如果有,就转发请求给后继的责任对象         * 如果没有,则处理请求         */        if(getSuccessor() != null)        {                        System.out.println("放过请求");            getSuccessor().handleRequest();                    }else        {                        System.out.println("处理请求");        }    }}
//客户端public class Client {    public static void main(String[] args) {        //组装责任链        Handler handler1 = new ConcreteHandler();        Handler handler2 = new ConcreteHandler();        handler1.setSuccessor(handler2);        //提交请求        handler1.handleRequest();    }}

三、具体场景以及实现

使用场景:
  申请聚餐费用的管理。
  申请聚餐费用的大致流程一般是:由申请人先填写申请单,然后交给领导审批,然后得到结果的通知。
  不同级别的领导,对于审批的额度是不一样的,比如,项目经理只能审批1000元以内的申请;部门经理能审批10000元以内的申请;而总经理可以审核任意额度的申请。
  也就是说,当某人提出聚餐费用申请的请求后,该请求会经由项目经理、部门经理、总经理之中的某一位领导来进行相应的处理,但是提出申请的人并不知道最终会由谁来处理他的请求,一般申请人是把自己的申请提交给项目经理,或许最后是由总经理来处理他的请求。

代码实现:

员工类:

public class Employee {    private String name;    public Employee(String name) {        this.name = name;    }    public String request(int money){        return name+"申请"+money;    }}

项目经理类:

public class ProjectManager {    public String doRequest(Employee employee , int money){        return "项目经理同意"+employee.request(money);    }}

部门经理类:

public class DeptManager{        public String doRequest(Employee employee , int money){            return "部门经理同意"+employee.request(money);        }}

总经理类:

public class GeneralManager {    public String doRequest(Employee employee , int money){        return "总经理同意"+employee.request(money);    }}

客户端:

public class Client {    public static void main(String[] args) {        Employee employee = new Employee("阿黄");        int money = (int) (Math.random() * 15000);        System.out.println(money);        ProjectManager projectManager = new ProjectManager();        DeptManager deptManager = new DeptManager();        GeneralManager generalManager = new GeneralManager();        String result = "";        if (money <= 5000) {            result = projectManager.doRequest(employee, money);        } else if (money <= 10000) {            result = deptManager.doRequest(employee, money);        } else {            result = generalManager.doRequest(employee, money);        }        System.out.println(result);    }}

运行结果(每一次可能不同):
这里写图片描述

 可以使用责任链模式来实现上述功能:当某人提出聚餐费用申请的请求后,该请求会在 项目经理—〉部门经理—〉总经理 这样一条领导处理链上进行传递,发出请求的人并不知道谁会来处理他的请求,每个领导会根据自己的职责范围,来判断是处理请求还是把请求交给更高级别的领导,只要有领导处理了,传递就结束了。
 这里写图片描述

抽象处理者角色类:

public abstract class Handler {    /**     * 持有下一个处理请求的对象     */    protected Handler nextHandler = null;    /**     * 取值方法     */    public Handler getNextHandler() {        return nextHandler;    }    /**     * 设置下一个处理请求的对象     */    public void setNextHandler(Handler nextHandler) {        this.nextHandler = nextHandler;    }    /**     * 处理聚餐费用的申请     * @param employeeName    申请人     * @param money     申请的金额     * @return          申请结果     */    public abstract String handleRequest(String employeeName , int money);}

具体处理者角色:

public class ProjectManager extends Handler {    @Override    public String handleRequest(String employeeName, int money) {        String result = "";        if(money <= 1000){            if(employeeName.equals("阿黄")){                result = "项目经理同意"+employeeName+"申请"+money;            }else{                result = "项目经理不同意"+employeeName+"申请"+money;            }        }else{            if(getNextHandler() != null){                return getNextHandler().handleRequest(employeeName,money);            }        }        return result;    }}
public class DeptManager extends Handler {    @Override    public String handleRequest(String employeeName, int money) {        String result = "";        if(money <= 10000){            result = "部门经理同意"+employeeName+"申请"+money;        }else{            if(getNextHandler() != null){                return getNextHandler().handleRequest(employeeName,money);            }        }        return result;    }}
public class GeneralManager extends Handler {    @Override    public String handleRequest(String employeeName, int money) {        String result = "";        if(money <= 30000){            result = "总经理不同意"+employeeName+"申请"+money;        }else{            if(getNextHandler() != null){                return getNextHandler().handleRequest(employeeName,money);            }        }        return result;    }}

客户端:

public class Client {    public static void main(String[] args) {        int money = (int) (Math.random() * 15000);        //组装责任链        Handler h1 = new GeneralManager();        Handler h2 = new DeptManager();        Handler h3 = new ProjectManager();        h3.setNextHandler(h2);        h2.setNextHandler(h1);        //开始测试        String test1 = h3.handleRequest("阿黄", 800);        System.out.println("test1 = " + test1);        String test2 = h3.handleRequest("阿狗", 400);        System.out.println("test2 = " + test2);        System.out.println("---------------------------------------");        String test3 = h3.handleRequest("阿黄", 2000);        System.out.println("test3 = " + test3);        String test4 = h3.handleRequest("阿狗", 2000);        System.out.println("test4 = " + test4);        System.out.println("---------------------------------------");        String test5 = h3.handleRequest("阿黄", 15000);        System.out.println("test5 = " + test5);        String test6 = h3.handleRequest("阿狗", 15000);        System.out.println("test6 = " + test6);    }}

运行结果:
这里写图片描述

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1岁小儿特别懒怎么办 17的孩子很懒怎么办 上大班的孩子不愿写字怎么办 快上中班的小朋友不爱学习怎么办 小学生两边肩膀不平应该怎么办 写字右肩膀疼是怎么办 开车久了肩膀疼怎么办 3岁宝宝撕书怎么办 孩子上幼儿园不爱写字怎么办 一年级小孩不爱做作业怎么办 小孩不愿多做作业怎么办 小孩一年级不自觉做作业怎么办 小孩会读不会写怎么办 好多字都不会写怎么办 写作业怎么办才能写快 五周宝宝爱玩不写字怎么办 爱玩手机的小孩怎么办? 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办 4岁宝宝不写字怎么办 四岁宝宝不写字怎么办 孩子学习粗心计算能力差怎么办 一年级的小朋友不爱看书怎么办 马上要生了害怕怎么办 孩子做题不爱读题怎么办 孩子作业写的慢怎么办 孩子学习不好怎么办我们有绝招 英语不会做题怎么办呢? 小学二年级孩子厌学怎么办 狗狗拉肚子不吃东西怎么办 小孩做作业时容易发呆怎么办 一上高速就犯困怎么办 孩子初中数学学不好怎么办