package org.chinasoft.filter; /** * 过滤器的规范 * @author lilei * @version 1.0 * @time 2010-12-25 上午10:18:43 */ public interface Filter { /** * 进行过滤的方法 * @param chain 过滤的连锁 */ void doFilter(FilterChain chain); }
package org.chinasoft.filter; import java.util.Iterator; /** * 持有所有过滤器集合上的迭代器的引用 * 通过此引用进行过滤的递归操作 * @author lilei * @version 1.0 * @time 2010-12-25 上午10:19:55 */ public class FilterChain { /** * 过滤器上的迭代器句柄 */ private Iterator<Filter> iterator; /** * 拿到所有过滤器上的迭代器,通过此迭代器,进行递归,实现过滤的操作 */ public void doFilter() { if(iterator.hasNext()) { Filter filter = iterator.next(); filter.doFilter(this); } else { System.out.println("hello world!"); } } /** * * @return 过滤器上的迭代器 */ public Iterator<Filter> getIterator() { return iterator; } /** * * @param iterator 设置过滤器对象 */ public void setIterator(Iterator<Filter> iterator) { this.iterator = iterator; } }
对于时间的过滤操作类:TimeFilter.java
import org.chinasoft.filter.Filter; import org.chinasoft.filter.FilterChain; public class TimeFilter implements Filter { @Override public void doFilter(FilterChain chain) { System.out.println("start:" + System.currentTimeMillis()); chain.doFilter(); System.out.println("end:" + System.currentTimeMillis()); } }
对与日志的过滤器操作类:LogFilter.java
import org.chinasoft.filter.Filter; import org.chinasoft.filter.FilterChain; public class LogFilter implements Filter { @Override public void doFilter(FilterChain chain) { System.out.println("filter log start"); chain.doFilter(); System.out.println("filter log end"); } }
测试的类:TestFilter.java
import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.chinasoft.filter.Filter; import org.chinasoft.filter.FilterChain; public class TestFilter { public static void main(String[] args) { TimeFilter timeFilter = new TimeFilter(); LogFilter logFilter = new LogFilter(); List<Filter> all = new ArrayList<Filter>(); all.add(timeFilter); all.add(logFilter); Iterator<Filter> iter = all.iterator(); FilterChain chain = new FilterChain(); chain.setIterator(iter); chain.doFilter(); } }
程序执行的结果:
start:1293242790062 filter log start hello world! filter log end end:1293242790062
程序在FilterChain的doFilter()方法和Filter实现类的doFilter(FilterChain chain)方法,之间进行递归操作!