拦截过滤器模式

拦截过滤器模式


拦截过滤器模式:允许开发人员通过不同的标准,过滤一组对象,通过逻辑操作把他们以解耦的方式把他们连接起来,他可以组合多个标准来获得单一标准。在Java web中主要用于统一接收并过滤客户端的请求,根据过滤器的选择,将请求传送给对应目标处理程序。

场景

现有一段文字,按要求过滤将文符过滤出来
例如:

 输入: 				"5UCHoddo&+Qo4.~*cQ"
 过滤字母输出:		"5&+4.~*"
 过滤数字输出:		"UCHoddo&+Qo.~*cQ"
 过滤字符输出:		"5UCHoddoQo4cQ"

实现

IFilter:接口,用于统一的过滤标准
XXXFilterImpl:IFilter的实现类,用于IFilter中方法的具体实现
FilterManager:用于管理多个过滤器
deo:演示类

过滤接口

  • IFilter.java
	/**
	 * 用于统一的过滤标准
	 * 
	 * @author admian
	 *
	 */
	public interface IFilter {
		String doFilter(String content); 
	}

具体实现类

  • LetterFilterImpl.java
	/**
	 * 具体的过滤类,用于过滤字母a~z,A~Z
	 * 
	 * @author admian
	 *
	 */
	public class LetterFilterImpl implements IFilter {
	
		private String letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	
		@Override
		public String doFilter(String content) {
			StringBuffer sb = new StringBuffer();
			char[] cs = content.toCharArray();
			for (char c : cs) {
				if (!letter.contains((c + "").toUpperCase())) {
					sb.append(c);
				}
			}
			return new String(sb);
		}
	
	}
  • NumberFilterImpl .java
	/**
	 * 具体的过滤类,用于过滤数字0~9
	 * @author admian
	 *
	 */
	public class NumberFilterImpl implements IFilter {
	
		private String number = "0123456789"; 
	
		@Override
		public String doFilter(String content) {
			StringBuffer sb = new StringBuffer();
			char[] cs = content.toCharArray();
			for (char c : cs) {
				if (!number.contains(c + "")) {
					sb.append(c);
				}
			}
			return new String(sb);
		}
	
	}
  • CharFilterImpl.java
	/**
	 * 具体的过滤类,用于过滤非数字0~9和非字母a~z,A~Z
	 * @author admian
	 *
	 */
	public class CharFilterImpl implements IFilter {
	
		private String letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		private String number = "0123456789";
		
		@Override
		public String doFilter(String content) {
			StringBuffer sb = new StringBuffer();
			char[] cs = content.toCharArray();
			for (int i = 0; i < cs.length; i++) {
				if (letter.contains((cs[i] + "").toUpperCase()) && number.contains(cs[i] + "")) {
					sb.append(cs[i]);
				}
			}
			return new String(sb);
		}
	
	}

过滤器管理类

  • FilterManager.java
	public class FilterManager {
		List<IFilter> filters = new LinkedList<>();
	
		public void addFilter(IFilter filter) {
			filters.add(filter);
		}
	
		public String excute(String content) {
			for (IFilter filter : filters) {
				content = filter.doFilter(content);
			}
			return content;
		}
	 
		public void excuteRemove(IFilter filter) { 
			filters.remove(filter);
		}
	
	}

过滤器演示类

  • deo.java
	public class deo {
	
		public static void main(String[] args) {
			String content = "5UCHoddo&+Qo4.~*cQ";
			FilterManager manager = new FilterManager();
			LetterFilterImpl f1 = new LetterFilterImpl();
			NumberFilterImpl f2 = new NumberFilterImpl();
			CharFilterImpl f3 = new CharFilterImpl();
			manager.addFilter(f1);
			manager.addFilter(f2); 
			manager.addFilter(f3);
			
			String s1 = manager.excute(content);  
			System.out.println("过滤字母、数字、字符:"+s1);
			 
			manager.excuteRemove(f3);
			String s2 = manager.excute(content);  
			System.out.println("过滤字母、数字:"+s2);
			
			manager.excuteRemove(f2);
			String s3 = manager.excute(content);  
			System.out.println("过滤字母:"+s3);
			
			manager.excuteRemove(f1);
			String s4 = manager.excute(content);  
			System.out.println("无过滤:"+s4);
		}
	}

结果:

过滤字母、数字、字符:
过滤字母、数字:&+.~*
过滤字母:5&+4.~*
过滤字母:5UCHoddo&+Qo4.~*cQ

通过新的语言特性,我们可以简化设计模式的使用,更快速的开发程序。这是简单的过滤器模式希望不足,有什么请大家多多指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值