基本介绍:
1、目的:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来;
2、实现:制定不同的规则来对一组对象进行过滤,然后对过滤结果进行分组。
场景举例:
有一个手机套餐的例子,过滤出符合要求的手机套餐
代码示例:
/**
* 客户的手机套餐
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Consumer implements Serializable {
private static final long serialVersionUID = -2830434210628625159L;
/**
* 姓名
*/
private String name;
/**
* 套餐价格
*/
private Integer price;
/**
* 套餐流量
*/
private Integer flow;
}
抽象的过滤接口以及接口的两个具体实现类
/**
* 抽象过滤器接口
*/
public interface Filter {
/**
* 过滤筛选出需要的套餐
* @param consumerList 套餐列表
* @return 过滤后的套餐列表
*/
List<Consumer> filterConsumers(List<Consumer> consumerList);
}
/**
* 流量过滤器
*/
public class FlowFilter implements Filter{
@Override
public List<Consumer> filterConsumers(List<Consumer> consumerList) {
ArrayList<Consumer> consumers = new ArrayList<>();
for (Consumer consumer : consumerList) {
//过滤出套餐流量1G以上的
if (consumer.getFlow()>1000){
consumers.add(consumer);
}
}
return consumers;
}
}
/**
* 价格过滤器
*/
public class PriceFilter implements Filter{
@Override
public List<Consumer> filterConsumers(List<Consumer> consumerList) {
ArrayList<Consumer> consumers = new ArrayList<>();
for (Consumer consumer : consumerList) {
//过滤出套餐价格100以内的
if (consumer.getPrice()<100){
consumers.add(consumer);
}
}
return consumers;
}
}
过滤器的调用
public class Client {
public static void main(String[] args) {
ArrayList<Consumer> list = new ArrayList<>();
list.add(new Consumer("PackageOne",38,800));
list.add(new Consumer("PackageTwo",50,1200));
list.add(new Consumer("PackageThree",200,2000));
List<Consumer> consumerList = new FlowFilter().filterConsumers(list);
System.out.println("流量过滤结果:");
for (Consumer consumer : consumerList) {
System.out.println(consumer);
}
List<Consumer> priceList = new PriceFilter().filterConsumers(list);
System.out.println("价格过滤结果:");
for (Consumer consumer : priceList) {
System.out.println(consumer);
}
}
}
涉及到的角色:
1、 AbstractFilter(抽象过滤器角色):在客户端可以调用它的方法,在抽象过滤器角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的实现类去,传递给相应的实现类对象处理。
2、 ConcreteFilter(具体滤器角色):在客户端可以调用它的方法,在具体滤器角色会对目标对象集合进行逻辑过滤,最后再返回一个过滤后的集合。
3、 Subject(被过滤角色):在软件系统中可以有一个或者多个目标角色,在具体过滤器中会对目标角色进行逻辑处理以查看是否是我想要的。