设计模式-职责链模式 (分离职责,动态组合)

一:业务场景

我们申请聚餐经费的审批:

项目经理只能审批500元以下的,

部门经理可以审批1000元以下的,

总经理可以审批1000元以上的

二:看看我们不用设计模式的平时代码逻辑

/**
 * 处理聚餐费用的对象
 * @author dy
 * @since 2016-08-12  & JDK 1.8.0_91
 */
public class FeeRequest_demo {


    public String requestToProjectManager(String user,double fee){
        String result = "";
        if (fee<500)
            result = this.projectManagerHandler(user, fee);
        else if (fee< 1000)
            result = this.dptManagerHandler(user, fee);
        else if (fee>1000)
            result = this.generalManagerHandler(user, fee);
        return result;
    }

    private  String projectManagerHandler(String user,double fee){
        return "项目经理同意给你报销:"+fee;
    }

    private  String dptManagerHandler(String user,double fee){
        return "部门经理同意给你报销:"+fee;
    }

    private  String generalManagerHandler(String user,double fee){
        return "总经理同意给你报销:"+fee;
    }

这里例子比较简单,主要是学习设计模式,又不是学习处理业务的,哈哈

ok,我们来测试下

public static void main(String[] args) {
    FeeRequest_demo feeRequest =new FeeRequest_demo();
    System.out.println(feeRequest.requestToProjectManager("", 300));
    System.out.println(feeRequest.requestToProjectManager("", 600));
    System.out.println(feeRequest.requestToProjectManager("", 1200));

}

 

思考,以上代码有什么问题?实际业务场景中,我们的审批流程经常变更,业务处理也经常变更,这就要求我们必须设计更加灵活的程序。

三:职责链设计模式

定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。并将这些对象形成一条链,并沿着这条链传递该请求,直到有一个对象处理了它为止。

四:使用设计模式重写示例:

 

/**
 * 定义职责对象接口
 * @author dy
 * @since 2016-08-12  & JDK 1.8.0_91
 */
public abstract class Handler {

    /**
     * 通常持有下一个处理的请求对象
     */
    protected Handler nextHandler;

    public Handler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }


    /**
     * 处理申请
     * @param user
     * @param fee
     * @return
     */
    public abstract String requestToFee(String user,double fee);
}
public class ProjectManagerHandler extends Handler {
    public ProjectManagerHandler(Handler nextHandler) {
        super(nextHandler);
    }
    @Override
    public String requestToFee(String user, double fee) {
        if (fee<500){
            return "项目经理同意给你报销:"+fee;
        }
        else{
            if (nextHandler != null) {
                return nextHandler.requestToFee(user, fee);
            }
        }
        return "非法处理";
    }
}
public class DptManagerHandler extends Handler {
    public DptManagerHandler(Handler nextHandler) {
        super(nextHandler);
    }
    @Override
    public String requestToFee(String user, double fee) {
        if (fee<1000){
            return "部门经理同意给你报销:"+fee;
        }
        else{
            if (nextHandler != null) {
                return nextHandler.requestToFee(user, fee);
            }
        }
        return "非法处理";
    }
}

 

public class GeneralManagerHandler extends Handler {

    public GeneralManagerHandler(Handler nextHandler) {
        super(nextHandler);
    }

    @Override
    public String requestToFee(String user, double fee) {
        if (fee>1000){
            return "总经理同意给你报销:"+fee;
        }
        else{
            if (nextHandler != null) {
                return nextHandler.requestToFee(user, fee);
            }
        }
        return "非法处理";
    }
}

 

ok,让我们来测试下吧!

/**
 * @author dy
 * @since 2016-08-12  & JDK 1.8.0_91
 */
public class Client {


    public static void main(String[] args) {
        /**
         * 组装职责链
         */
        Handler generalHandler = new GeneralManagerHandler(null);
        Handler depHandler = new DptManagerHandler(generalHandler);
        Handler prjHandler = new ProjectManagerHandler(depHandler);


        System.out.println(prjHandler.requestToFee("", 300));
        System.out.println(prjHandler.requestToFee("", 600));
        System.out.println(prjHandler.requestToFee("", 1200));
    }
}

运行结果:

是不是和没有设计模式的 运行结果一抹一眼啊 !

这里就不演示处理多种请求了 ,大同小异的!

想想我们平时用到的拦截器,是不是用到了职责链设计模式啊!看来这个也很重要哦

转载于:https://my.oschina.net/dyyweb/blog/731924

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值