Java模式之责任链
package com.learning.chain;public interface Filter {public void init();public void doFilter(FilterChain chain);public void destroy();}
?然后定义Filter配置类
package com.learning.chain;public class ApplicationFilterConfig {private Filter filter;public Filter getFilter() {return filter;}public void setFilter(Filter filter) {this.filter = filter;}}?然后提取责任链抽象接口
package com.learning.chain;public interface FilterChain {public void doFilter();}?实现责任链抽象接口
package com.learning.chain;public class ApplicationFilterChain implements FilterChain {private ApplicationFilterConfig[] filters = new ApplicationFilterConfig[0];private static int INCREMENT = 10;private int length = 0;private int pos = 0;void addFilter(ApplicationFilterConfig filterConfig) {if (length == filters.length) { ApplicationFilterConfig[] newFilters = new ApplicationFilterConfig[length + INCREMENT]; System.arraycopy(filters, 0, newFilters, 0, length); filters = newFilters; } filters[length++] = filterConfig;}public void doFilter() {if (pos < length) {ApplicationFilterConfig filterConfig = filters[pos++];Filter filter = filterConfig.getFilter();filter.doFilter(this);}}}?实现责任链工厂类
package com.learning.chain;public class ApplicationFilterFactory {private static ApplicationFilterFactory factory;public static ApplicationFilterFactory getInstance() {if (factory == null) {factory = new ApplicationFilterFactory();}return factory;}public ApplicationFilterChain createFilterChain() {return new ApplicationFilterChain();}}?写测试用例
package com.learning.chain;import java.io.File;import java.io.FileInputStream;import java.util.Enumeration;import java.util.Properties;import org.junit.Test;public class TestFilter {@Testpublic void test() throws Exception {// 创建过滤器责任链ApplicationFilterChain chain = ApplicationFilterFactory.getInstance().createFilterChain();File file = new File("chain.properties");Properties filterProperties = new Properties();// 载入过滤器filterProperties.load(new FileInputStream(file));Enumeration<?> names = filterProperties.propertyNames();while (names.hasMoreElements()) {String filterName = (String)filterProperties.get(names.nextElement());ApplicationFilterConfig filterConfig = new ApplicationFilterConfig();filterConfig.setFilter((Filter)Class.forName(filterName).newInstance());// 把过滤器加入到责任链中chain.addFilter(filterConfig);}// 开始执行chain.doFilter();}}?最后配置好配置文件
filter1=com.learning.chain.FilterAfilter2=com.learning.chain.FilterAfilter3=com.learning.chain.FilterBfilter4=com.learning.chain.FilterA
?ok,运行起了,效果还不错。。。