浅谈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 ); } }
运行:
------------------------------------------------