设计模式3.8 过滤器模式

字节跳动飞书内推!
北京、杭州、武汉、广州、深圳、上海,六大城市等你来投。
感兴趣的朋友可以私我咨询&内推,也可以通过链接直接投递!
海量HC,极速响应,快来和我成为同事吧。
今日头条、抖音、Tik Tok也可以内推~

点击进入我的博客

过滤器模式使用不同的条件过滤一组对象,并通过逻辑操作以解耦方式将其链接。这种类型的设计模式属于结构模式,因为该模式组合多个标准以获得单个标准。

3.8.1 细节

步骤
  1. 创建一个要过滤的普通类,要有获得其私有属性的get方法
  2. 创建一个接口,规定过滤方法
  3. 实现接口,可以依需要重写过滤方法,参数传递的一般是存储过滤类的容器类
  4. 复杂过滤类可以通过设置传递接口参数(复用其他基础过滤类)来实现多重过滤
Java8

Java8中的lambda表达式可以更简单的实现过滤器

List movies = Stream.of(
                new Movie("大话西游","comedy"),
                new Movie("泰囧", "comedy"),
                new Movie("禁闭岛", "suspense"))
                .filter(var -> "comedy".equals(var.getType()))
                .collect(Collectors.toList());

3.8.2 电影的例子

  1. 创建被过滤的类Movie,根据它的type属性实现过滤
  2. 创建接口Criteria,规定过滤方法
  3. 创建喜剧电影过滤器ComedyMovieCriteria,根据comedy==movie.type来过滤出需要的喜剧电影
public class Test {
    public static void main(String[] args) {
        List movies = new ArrayList(){{
            add(new Movie("大话西游","comedy"));
            add(new Movie("泰囧", "comedy"));
            add(new Movie("禁闭岛", "suspense"));
        }};
        System.out.println(new ComedyMovieCriteria().meetCriteria(movies));
    }
}

// 被筛选的对象
class Movie {
    private String name;
    // 电影类型
    private String type;

    public Movie(String name, String type) {
        this.name = name;
        this.type = type;
    }
    // getters & setters & toString
}

// 过滤器接口
interface Criteria {
    /**
     * @param movies 要被筛选的电影
     * @return 筛选后的结果
     */
    List meetCriteria(List movies);
}

// 过滤喜剧电影的过滤器,要求是movie.type==comedy
class ComedyMovieCriteria implements Criteria {
    @Override
    public List meetCriteria(List movies) {
        List result = new ArrayList<>();
        for (Movie movie : movies) {
            if ("comedy".equals(movie.getType())) {
                result.add(movie);
            }
        }
        return result;
    }
}

你可能感兴趣的:(设计模式3.8 过滤器模式)