拦截过滤器模式
拦截过滤器模式:允许开发人员通过不同的标准,过滤一组对象,通过逻辑操作把他们以解耦的方式把他们连接起来,他可以组合多个标准来获得单一标准。在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
通过新的语言特性,我们可以简化设计模式的使用,更快速的开发程序。这是简单的过滤器模式希望不足,有什么请大家多多指教