浅谈Java五大设计原则之责任链模式

首先我们得先定义一个责任链模式:

  责任链模式是一种线性执行流程,多个对象都有机会去执行同一个任务,只是在执行过程中,

由于执行的权利和范围不一样,那么当自己不能处理此任务时,就必须将这个任务抛给下一个对象,

一次类推,就形成了一个执行链。

  典型例子就是Tomcat中的过滤器,当配置了多个过滤器时,就会形成一条过滤链,客户端发起

的请求会经过这条过滤链上的每一个过滤器,最终只有一个过滤器去处理这个请求。

纯与不纯的责任链:

  1.纯的责任链是在整条链中,只有一个对象可以处理这个任务。不会处理完一半,再移送给另一个

对象。

  2.在整条纯的责任链,必须有一个对象能够处理当前的任务。不可能出现一个任务没有一个对象去

处理的情况。

  在实际的开发中,多数都会出现不纯的责任链。其实这是责任链模型的一种改变,是为了迎合业务的

变化。

先定义一个接口:

package org.demo2;

/**
 * Created by Administrator on 2016/11/23.
 */
//定义一个接口
public interface AbstractHandler {
    //接口的方法
    public String requestHandler(int money, HandlerChain chain);
}

在写两个类实现这个接口

package org.demo2;

/**
 * Created by Administrator on 2016/11/23.
 */
//班委handler,实现了AbstractHandler
public class QuadHandler implements AbstractHandler {

    //重写接口的方法
    @Override
    public String requestHandler(int money, HandlerChain chain) {
        //判断是否符合条件
        if ( money <= 50 ) {
            return "班委通过审核";
        }
        //如果不符合,则将该任务移送到下一个对象
        return chain.execute( money );
    }
}
package org.demo2;

/**
 * Created by Administrator on 2016/11/23.
 */
//老师handler,实现了AbstractHandler
public class TeacherHandler implements AbstractHandler {

    //重写接口的方法
    @Override
    public String requestHandler(int money, HandlerChain chain) {
        //判断是否符合条件
        if ( money <= 200 ) {
            return "班主任通过审核";
        }
        //如果不符合,则将该任务移送到下一个对象
        return chain.execute( money );
    }
}

写一个执行链的类:

package org.demo2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2016/11/23.
 * 执行链管理者
 * 将链上的所有对象都放到此类中管理
 */
public class HandlerChain {
    //这个集合存放所有的执行者
    private List<AbstractHandler> handlers = new ArrayList<>();
    //声明一个迭代器,用于遍历list集合
    private Iterator<AbstractHandler> iterator;

    //在实例化该对象时,将QuaHandler和TeacherHandler添加到集合中
    public HandlerChain() {
        //将对象添加到list集合中
        handlers.add( new QuadHandler() );
        handlers.add( new TeacherHandler() );
        //返回一个迭代器
        iterator = handlers.iterator();
    }

    //执行时遍历集合,调用每一个执行者
    public String execute( int money ) {
        //遍历list集合
        if ( iterator.hasNext() ) {
            //返回下一个Handler对象
            return iterator.next().requestHandler( money, this );
        }
        //若不存在,则返回null
        return null;
    }
}

最后写一个main方法:

package org.demo2;

/**
 * Created by Administrator on 2016/11/23.
 */
public class Main {
    public static void main(String[] args) {
        //实例化HandlerChain对象
        HandlerChain chain = new HandlerChain();
        //执行execute方法,返回一个字符串
        String msg = chain.execute( 40 );
        System.out.println( msg );
    }
}

运行:

若修改参数:

package org.demo2;

/**
 * Created by Administrator on 2016/11/23.
 */
public class Main {
    public static void main(String[] args) {
        //实例化HandlerChain对象
        HandlerChain chain = new HandlerChain();
        //执行execute方法,返回一个字符串
     //将参数修改为160 String msg = chain.execute( 160 ); System.out.println( msg ); } }

运行:

------------------------------------------------

原文地址:https://www.cnblogs.com/hmake/p/6095470.html