过滤器模式是一种设计模式,使开发人员可以使用不同的条件过滤一组对象,并通过逻辑操作以解耦方式将其链接。 这种类型的设计模式属于结构模式,因为该模式组合多个标准以获得单个标准。
实现
主要有3个角色
请求实体类
/**
* 请求类,模拟一次请求
* 有名字和信息两个属性,根据实际情况自定义
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:13
*/
public class Request {
private String name;
private String info="";
public Request(String name, int num) {
this.name = name;
this.num = num;
}
//一个条件数值,用来过滤条件判断
private int num;
//get set方法略
}
过滤器:自定义方法对请求进行判断拦截数据加工等操作
/**
* 过滤器接口
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:11
*/
public interface Filter {
/**
*对请求进行一次过滤或者处理
* 如果继续执行后面的过滤器,返回true,否则返回false
* @param request 请求类
*/
public boolean execute(Request request);
}
/**
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:48
*/
public class Filter_A implements Filter{
@Override
public boolean execute( Request request) {
System.out.println("请求"+request.getName()+"正在执行Filter_A过滤器-----------------------");
//对请求进行判断
if (request!=null&&request.getNum()>10){
System.out.println(request.getInfo()+"通过了Filter_A过滤器,继续执行下一个");
request.setInfo(request.getInfo()+"通过了Filter_A过滤器 ");
return true;
}else if (request!=null){
request.setInfo(request.getInfo()+"未通过了Filter_A过滤器,停止执行\n");
}
return false;
}
}
/**
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:48
*/
public class Filter_B implements Filter{
@Override
public boolean execute( Request request) {
System.out.println("请求"+request.getName()+"正在执行Filter_B过滤器-----------------------");
//对请求进行判断
if (request!=null&&request.getNum()>20){
System.out.println(request.getInfo()+"通过了Filter_B过滤器,继续执行下一个");
request.setInfo(request.getInfo()+"通过了Filter_B过滤器 ");
return true;
}else if (request!=null){
request.setInfo(request.getInfo()+"未通过了Filter_B过滤器,停止执行\n");
}
return false;
}
}
/**
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:48
*/
public class Filter_C implements Filter{
@Override
public boolean execute( Request request) {
System.out.println("请求"+request.getName()+"正在执行Filter_C过滤器-----------------------");
//对请求进行判断
if (request!=null&&request.getNum()>30){
System.out.println(request.getInfo()+"通过了Filter_C过滤器,继续执行下一个");
request.setInfo(request.getInfo()+"通过了Filter_C过滤器 ");
return true;
}else if (request!=null){
request.setInfo(request.getInfo()+"未通过了Filter_C过滤器,停止执行\n");
}
return false;
}
}
过滤器容器:存储多个过滤器,可以自定义执行顺序和数量,并使请求执行过滤器列表
/**
* 过滤器容器类 用来管理过滤器
* @author tiancaixiaoniuniu
* @date 2019/4/12 15:16
*/
public class FilterContainer {
private List<Filter> list=new ArrayList<>();
//设置要执行的过滤器列表
public void setFilterList(List<Filter> list){
this.list=list;
}
//执行过滤器
public void doFilter(Request request){
for (Filter filter:list) {
//如果返回false,结束执行
if (!filter.execute( request)){
break;
}
}
System.out.println("执行完成!");
}
}
客户端执行
/**
* @author tiancaixiaoniuniu
* @date 2019/4/12 16:25
*/
public class Client {
public static void main(String[] args) {
//配置过滤器执行列表
List<Filter> list=new ArrayList<>();
list.add(new Filter_A());
list.add(new Filter_B());
list.add(new Filter_C());
//加载过滤器容器
FilterContainer filterContainer=new FilterContainer();
filterContainer.setFilterList(list);
//请求
Request request1=new Request("请求1",25);
Request request2=new Request("请求2",35);
filterContainer.doFilter(request1);
System.out.println(request1.getInfo());
filterContainer.doFilter(request2);
System.out.println(request2.getInfo());
}
}
执行结果:
*原创作品,转载请表明出处。有建议或者问题欢迎联系我,QQ1595787997