【结构型模式】Java设计模式之:过滤器模式

过滤器模式(Filter Pattern)是一种结构型设计模式,它允许开发人员指定一系列过滤器条件,来对一些对象进行多个条件的筛选或排除,常用于对集合或序列进行筛选、过滤等操作。

过滤器模式通常包含以下角色:文章源自新逸网络-https://www.xinac.net/9359.html

  1. 抽象过滤器(Filter):定义了过滤器的接口,包括进行过滤的方法。
  2. 具体过滤器(ConcreteFilter):实现了抽象过滤器接口的具体过滤器,实现了特定的过滤方法。
  3. 过滤器链(FilterChain):维护过滤器链,提供添加和移除过滤器的方法,并提供过滤的方法。
  4. 目标对象(Target):被过滤的目标对象。

 文章源自新逸网络-https://www.xinac.net/9359.html

代码实现如下:文章源自新逸网络-https://www.xinac.net/9359.html

//抽象过滤器接口
public interface Filter {
    public void filterObject(TargetObject obj);
}

//具体过滤器1
public class ConcreteFilter1 implements Filter {
    @Override
    public void filterObject(TargetObject obj) {
        //根据特定条件对目标对象进行过滤
        if (obj.getProperty1() > 10) {
            obj.setFilterFlag(true);
        }
    }
}

//具体过滤器2
public class ConcreteFilter2 implements Filter {
    @Override
    public void filterObject(TargetObject obj) {
        //根据特定条件对目标对象进行过滤
        if (obj.getProperty2().equals("value")) {
            obj.setFilterFlag(true);
        }
    }
}

//过滤器链
public class FilterChain {
    private List<Filter> filters = new ArrayList<>();
    public void addFilter(Filter filter){
        filters.add(filter);
    }
    public void removeFilter(Filter filter){
        filters.remove(filter);
    }
    public void filterObject(TargetObject obj){
        for(Filter filter : filters){
            filter.filterObject(obj);
        }
    }
}

//目标对象
public class TargetObject {
    private int property1;
    private String property2;
    private boolean filterFlag;
    public TargetObject(int p1, String p2){
        this.property1 = p1;
        this.property2 = p2;
    }
    public int getProperty1(){
        return this.property1;
    }
    public String getProperty2(){
        return this.property2;
    }
    public boolean getFilterFlag(){
        return this.filterFlag;
    }
    public void setFilterFlag(boolean flag){
        this.filterFlag = flag;
    }
}

public class Client {
    public static void main(String[] args) {
        //创建过滤器链
        FilterChain chain = new FilterChain();
        //添加具体过滤器
        chain.addFilter(new ConcreteFilter1());
        chain.addFilter(new ConcreteFilter2());
        //创建目标对象
        TargetObject obj = new TargetObject(15, "value");
        //进行过滤
        chain.filterObject(obj);
        if(obj.getFilterFlag()){
            System.out.println("The object is filtered");
        }else{
            System.out.println("The object is not filtered");
        }
    }
}

以上代码实现了一个过滤器模式的示例,其中包含了两个具体过滤器,目标对象和过滤器链。通过将具体过滤器添加到过滤器链中,然后将目标对象传入过滤器链的过滤方法,就可以对目标对象进行多个条件的筛选和过滤,最终得到一个过滤标志。文章源自新逸网络-https://www.xinac.net/9359.html

它将一个对象集合通过多个过滤器(Filter)进行过滤,最终得到满足条件的对象集合。其中,抽象类 Filter 定义了一个过滤方法 filter,用于判断对象是否符合过滤条件,具体的过滤器实现类 AgeFilterNameFilterGenderFilter 均继承该抽象类并实现该方法。类 FilterChain 则负责保存多个过滤器并依次调用它们进行过滤。文章源自新逸网络-https://www.xinac.net/9359.html

这种方式的好处在于,它将过滤器和被过滤对象解耦。过滤器可以判断对象是否符合某种规则,而不需要修改被过滤对象的结构。同时,通过将多个过滤器组合起来使用,我们可以更加灵活地对对象进行过滤。在实际应用中,这种方式可以用于数据过滤、请求拦截等场景。文章源自新逸网络-https://www.xinac.net/9359.html

此外,过滤器模式还能够使系统具有更好的扩展性,当需要增加新的过滤器时,只需要添加一个新的过滤器实现类,并将它添加到 FilterChain 中即可。不需要修改已有的代码,从而避免了可能引入的新错误。文章源自新逸网络-https://www.xinac.net/9359.html 文章源自新逸网络-https://www.xinac.net/9359.html

weinxin
新逸IT技术
扫一扫关注微信公众号
Admin
  • 本文由 发表于 2023-01-01
  • 转载请注明:https://www.xinac.net/9359.html
评论  0  访客  0
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定