【行为型模式】《大话设计模式》——读后感 (16)加薪非要老板批?——职责链模式

来源:互联网 发布:strcontains php 编辑:程序博客网 时间:2024/05/17 22:23

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

适用场景:

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;

2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;

3、处理一个请求的对象集合应被动态指定。

 

Handler:

package com.sjmx.responsibility.application;public abstract class Handler {    /**     * 持有下一个处理请求的对象     */    protected Handler successor = null;    /**     * 取值方法     */    public Handler getSuccessor() {        return successor;    }    /**     * 设置下一个处理请求的对象     */    public void setSuccessor(Handler successor) {        this.successor = successor;    }    /**     * 处理聚餐费用的申请     *      * @param user     *            申请人     * @param fee     *            申请的钱数     * @return 成功或失败的具体通知     */    public abstract String handleFeeRequest(String user, double fee);}

ProjectManager:

package com.sjmx.responsibility.application;public class ProjectManager extends Handler {    @Override    public String handleFeeRequest(String user, double fee) {        String str = "";        // 项目经理权限比较小,只能在500以内        if (fee < 500) {            // 为了测试,简单点,只同意张三的请求            if ("张三".equals(user)) {                str = "成功:项目经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";            } else {                // 其他人一律不同意                str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";            }        } else {            // 超过500,继续传递给级别更高的人处理            if (getSuccessor() != null) {                return getSuccessor().handleFeeRequest(user, fee);            }        }        return str;    }}

DeptManager:

package com.sjmx.responsibility.application;public class DeptManager extends Handler {    @Override    public String handleFeeRequest(String user, double fee) {        String str = "";        // 部门经理的权限只能在1000以内        if (fee < 1000) {            // 为了测试,简单点,只同意张三的请求            if ("张三".equals(user)) {                str = "成功:部门经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";            } else {                // 其他人一律不同意                str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";            }        } else {            // 超过1000,继续传递给级别更高的人处理            if (getSuccessor() != null) {                return getSuccessor().handleFeeRequest(user, fee);            }        }        return str;    }}

GeneralManager:

package com.sjmx.responsibility.application;public class GeneralManager extends Handler {    @Override    public String handleFeeRequest(String user, double fee) {        String str = "";        // 总经理的权限很大,只要请求到了这里,他都可以处理        if (fee >= 1000) {            // 为了测试,简单点,只同意张三的请求            if ("张三".equals(user)) {                str = "成功:总经理同意【" + user + "】的聚餐费用,金额为" + fee + "元";            } else {                // 其他人一律不同意                str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";            }        } else {            // 如果还有后继的处理对象,继续传递            if (getSuccessor() != null) {                return getSuccessor().handleFeeRequest(user, fee);            }        }        return str;    }}

 

 

客户端:

package com.sjmx.responsibility.application;public class Client {     public static void main(String[] args) {              //先要组装责任链              Handler h1 = new GeneralManager();              Handler h2 = new DeptManager();              Handler h3 = new ProjectManager();              h3.setSuccessor(h2);              h2.setSuccessor(h1);                            //开始测试              String test1 = h3.handleFeeRequest("张三", 300);              System.out.println("test1 = " + test1);                          String test2 = h3.handleFeeRequest("李四", 300);              System.out.println("test2 = " + test2);              System.out.println("---------------------------------------");                            String test3 = h3.handleFeeRequest("张三", 700);              System.out.println("test3 = " + test3);              String test4 = h3.handleFeeRequest("李四", 700);              System.out.println("test4 = " + test4);              System.out.println("---------------------------------------");                            String test5 = h3.handleFeeRequest("张三", 1500);              System.out.println("test5 = " + test5);              String test6 = h3.handleFeeRequest("李四", 1500);              System.out.println("test6 = " + test6);          }        }

 

test1 = 成功:项目经理同意【张三】的聚餐费用,金额为300.0元test2 = 失败:项目经理不同意【李四】的聚餐费用,金额为300.0元---------------------------------------test3 = 成功:部门经理同意【张三】的聚餐费用,金额为700.0元test4 = 失败:部门经理不同意【李四】的聚餐费用,金额为700.0元---------------------------------------test5 = 成功:总经理同意【张三】的聚餐费用,金额为1500.0元test6 = 失败:总经理不同意【李四】的聚餐费用,金额为1500.0元

 

阅读全文
0 0