读书人

Java方式之责任链

发布时间: 2013-04-05 10:24:33 作者: rapoo

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,运行起了,效果还不错。。。

读书人网 >编程

热点推荐