Java 之 责任链

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();
    }
}

demojava

public abstract class FeeHandler {
    /**
     * 持有下一个处理请求的对象
     */
    protected FeeHandler successor = null;

    /**
     * 取值方法
     */
    public FeeHandler getSuccessor() {
        return successor;
    }

    /**
     * 设置下一个处理请求的对象
     */
    public void setSuccessor(FeeHandler successor) {
        this.successor = successor;
    }

    /**
     * 处理聚餐费用的申请
     * 
     * @param user
     *            申请人
     * @param fee
     *            申请的钱数
     * @return 成功或失败的具体通知
     */
    public abstract String handleFeeRequest(String user, double fee);
}


public class ProjectManager extends FeeHandler {

    @Override
    public String handleFeeRequest(String user, double fee) {
        // TODO Auto-generated method stub
     // TODO Auto-generated method stub
        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;
    }

    

}

public class DeptManager extends FeeHandler {

    @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;
    }

}

public class GeneralManager extends FeeHandler {

    @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;
    }

}

public class FeeClient {
    public static void main(String[] args) {
        // 先要组装责任链
        FeeHandler h1 = new GeneralManager();
        FeeHandler h2 = new DeptManager();
        FeeHandler 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);
    }
}

 

学习设计模式强烈推荐的博客:java_my_lifegit

代码地址:lennon设计模式

相关文章
相关标签/搜索