设计模式3.8 过滤器模式
2018-12-02 本文已影响0人
卢卡斯哔哔哔
点击进入我的博客
过滤器模式使用不同的条件过滤一组对象,并通过逻辑操作以解耦方式将其链接。这种类型的设计模式属于结构模式,因为该模式组合多个标准以获得单个标准。
3.8.1 细节
步骤
- 创建一个要过滤的普通类,要有获得其私有属性的get方法
- 创建一个接口,规定过滤方法
- 实现接口,可以依需要重写过滤方法,参数传递的一般是存储过滤类的容器类
- 复杂过滤类可以通过设置传递接口参数(复用其他基础过滤类)来实现多重过滤
Java8
Java8中的lambda表达式可以更简单的实现过滤器
List<Movie> movies = Stream.of(
new Movie("大话西游","comedy"),
new Movie("泰囧", "comedy"),
new Movie("禁闭岛", "suspense"))
.filter(var -> "comedy".equals(var.getType()))
.collect(Collectors.toList());
3.8.2 电影的例子
- 创建被过滤的类
Movie
,根据它的type
属性实现过滤 - 创建接口
Criteria
,规定过滤方法 - 创建喜剧电影过滤器
ComedyMovieCriteria
,根据comedy==movie.type
来过滤出需要的喜剧电影
public class Test {
public static void main(String[] args) {
List<Movie> 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<Movie> meetCriteria(List<Movie> movies);
}
// 过滤喜剧电影的过滤器,要求是movie.type==comedy
class ComedyMovieCriteria implements Criteria {
@Override
public List<Movie> meetCriteria(List<Movie> movies) {
List<Movie> result = new ArrayList<>();
for (Movie movie : movies) {
if ("comedy".equals(movie.getType())) {
result.add(movie);
}
}
return result;
}
}