设计模式_责任链模式

责任链模式概念:

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

责任链模式应用场景:

  1 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
  2 你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
  3 可处理一个请求的对象集合应该被动态指定。

简单责任链模式案例:

package com.srrj.merchantEnter.test.handler;

/**
 * 责任链接口
 */
public abstract class Handler {
    //下一级责任链
    protected Handler handler;
    //设置下一级责任链
    public void setHandler(Handler handler){
        this.handler = handler;
    }

    //责任链处理方法
    public abstract void request(int request);
}

class HandlerRequest1 extends Handler{

    @Override
    public void request(int request) {
        if (request <= 10){
            System.out.println("the first object handler the request,the value = " + request);
        }else{
            super.handler.request(request);
        }
    }
}
class HandlerRequest2 extends Handler{

    @Override
    public void request(int request) {
        if (request > 10 && request <= 100){
            System.out.println("the second object handler the request,the value = " + request);
        }else{
            System.out.println("the request not handler");
        }
    }
}

测试:

package com.srrj.merchantEnter.test.handler;

import org.junit.Test;

/**
 * 责任链模式测试用例
 */
public class HandlerTest {

    @Test
    public void handlerTest(){
        int request = 1000;
        //组装责任链
        HandlerRequest1 handlerRequest1 = new HandlerRequest1();
        HandlerRequest2 handlerRequest2 = new HandlerRequest2();
        handlerRequest1.setHandler(handlerRequest2);
        handlerRequest1.request(request);
    }
}

较为复杂的责任链案例

场景:比如说某次聚会的费用报销流程,期中  项目经理<部门经理<总经理,项目经理报销额度不能大于500,则部门经理的报销额度是不大于1000,超过1000则需要总经理审核,根据这个场景来看代码案例:

package com.srrj.merchantEnter.test.handler;

/**
 * 责任链接口
 */
public abstract class ConsumeHandler {
    private ConsumeHandler nextHandler;

    public ConsumeHandler getNextHandler() {
        return nextHandler;
    }

    public void setNextHandler(ConsumeHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * user申请人 free报销费用
     */
    public abstract void doHandler(String user, double free);
}

/**
 * 项目经理
 */
class ProjectHandler extends ConsumeHandler{

    @Override
    public void doHandler(String user, double free) {
        if (free < 500){
            if ("lwx".equals(user)){
                System.out.println("ProjectHandler给予报销:" + free);
            }else{
                System.out.println("ProjectHandler报销不通过");
            }
        }else {
            if (null != super.getNextHandler()){
                getNextHandler().doHandler(user, free);
            }
        }
    }
}
/**
 * 部门经理
 */
class DepHandler extends ConsumeHandler{

    @Override
    public void doHandler(String user, double free) {
        if (free < 1000){
            if ("ls".equals(user)){
                System.out.println("DepHandler给予报销:" + free);
            }else {
                System.out.println("DepHandler报销不通过");
            }
        } else{
            if (null != super.getNextHandler()){
                getNextHandler().doHandler(user, free);
            }
        }
    }
}

/**
 * 总经理
 */
class GeneralHandler extends ConsumeHandler{

    @Override
    public void doHandler(String user, double free) {
        if (free >1000){
            if ("ww".equals(user)){
                System.out.println("GeneralHandler给予报销:" + free);
            }else {
                System.out.println("GeneralHandler报销不通过");
            }
        }else {
            if (null != super.getNextHandler()){
                getNextHandler().doHandler(user, free);
            }
        }
    }
}

测试用例:

package com.srrj.merchantEnter.test.handler;

import org.junit.Test;

/**
 * 责任链模式测试用例
 */
public class HandlerTest {

    @Test
    public void handlerTest() {
        ProjectHandler projectHandler = new ProjectHandler();
        DepHandler deptHandler = new DepHandler();
        GeneralHandler generalHandler = new GeneralHandler();
        projectHandler.setNextHandler(deptHandler);
        deptHandler.setNextHandler(generalHandler);
        projectHandler.doHandler("lwx", 450);
        projectHandler.doHandler("ls", 600);
        projectHandler.doHandler("ww", 600);
        projectHandler.doHandler("zy", 1500);
    }
}

本节完!

posted @ 2017-08-30 15:53  青春不打烊  阅读(195)  评论(0编辑  收藏  举报