美文网首页
过滤器链模式

过滤器链模式

作者: 桑榆非晚95 | 来源:发表于2021-06-24 11:53 被阅读0次
public interface IConfigFilterChain {

    public void doFilter(IConfigRequest request, IConfigResponse response);
    
}

public interface IConfigRequest {

    public Object getParameter(String key);

    public IConfigContext getConfigContext();

}

public interface IConfigResponse {
    
    public Object getParameter(String key);

    public IConfigContext getConfigContext();

}

public interface IConfigContext {
    
    public Object getParameter(String key);

    public void setParameter(String key, Object value);
}

public class ConfigFilterChainManager implements IConfigFilterChain {

    private List<IConfigFilter> filters = Lists.newArrayList();

    public synchronized ConfigFilterChainManager addFilter(IConfigFilter filter) {
        // ¸ù¾Ýorder´óС˳Ðò²åÈë
        int i = 0;
        while (i < this.filters.size()) {
            IConfigFilter currentValue = this.filters.get(i);
            if (currentValue.getFilterName().equals(filter.getFilterName())) {
                break;
            }
            if (filter.getOrder() >= currentValue.getOrder() && i < this.filters.size()) {
                i++;
            } else {
                this.filters.add(i, filter);
                break;
            }
        }

        if (i == this.filters.size()) {
            this.filters.add(i, filter);
        }
        return this;
    }
    

    @Override
    public void doFilter(IConfigRequest request, IConfigResponse response) throws DiamondException {
        new VirtualFilterChain(this.filters).doFilter(request, response);
    }

    private static class VirtualFilterChain implements IConfigFilterChain {

        private final List<? extends IConfigFilter> additionalFilters;

        private int currentPosition = 0;

        public VirtualFilterChain(List<? extends IConfigFilter> additionalFilters) {
            this.additionalFilters = additionalFilters;
        }

        @Override
        public void doFilter(final IConfigRequest request, final IConfigResponse response) throws DiamondException {
            if (this.currentPosition == this.additionalFilters.size()) {
                return;
            } else {
                this.currentPosition++;
                IConfigFilter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
                nextFilter.doFilter(request, response, this);
            }
        }
    }

}

相关文章

网友评论

      本文标题:过滤器链模式

      本文链接:https://www.haomeiwen.com/subject/wfmwyltx.html