codercheng 2020-06-16
/**
* 1.模式定义:
* 过滤器(Filter Pattern)又称为标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,
* 通过预算逻辑以解耦的方式将他们联系起来。这种类型的设计模式属于结构模型,说白了,就是按条件筛选一组对象出来。
* 目的:使用不同标准来过滤一组对象
* 实现:制定不同的规则来实现过滤,然后对过滤结果进行分组。
* 2.组成角色:
* 1)抽象过滤器角色(AbstractFilter):负责定义过滤器的实现接口,具体的实现还要具体过滤器角色去参与,客户端可以调用抽象过滤器角色中定义好
* 的方法,将 客户端的所有请求委派到具体的实现类去,从而让实现类去处理。
* 2)ConcreteFilter(具体过滤角色):该角色负责具体筛选规则的逻辑实现,最后再返回一个过滤后的数据集合,标准的过滤器只对数据做过滤,当然也
* 可以对集合中的数据做某项处理,再将处理后的集合返回。
* 3)Subject(被过滤的主体角色):一个软件系统中可以有一个或多个目标角色,在具体过滤器角色中对指定的目标进行处理。
* 3.过滤器延伸:
* 过滤器链:携带多个过滤器,并且可以以自定义顺序执行他们。
* 过滤器管理角色:负责管理过滤器和过滤器链。
* 4.应用场景:
* 垃圾桶分类
* 5.总结:
* 1)可插拔:过滤器的设计概念要求其实支持可插拔设计的。
* 2)有序性:过滤器是被设计为一组组的过滤装置,要实现数据过滤,就必须有序性要求.
* 3)过滤器的独立性:每种过滤器必须是独立的实体,其状态不受其它过滤器的影响,每个过滤器都有自己独立的数据输入输出接口,只要各个过滤器之间
* 传送的数据遵守共同的规约就可以相连接。
*/
/*
* 垃圾類,被過濾的主題角色
*/
public class Rubbish {
private String name; //垃圾名稱
private boolean isHarm; //是否有害垃圾
private boolean isRecycled; //是否可回收
private boolean isDry; //是否干垃圾
private boolean isWet; //是否湿垃圾
public Rubbish(String name, boolean isHarm, boolean isRecycled, boolean isDry, boolean isWet) {
this.name = name;
this.isHarm = isHarm;
this.isRecycled = isRecycled;
this.isDry = isDry;
this.isWet = isWet;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isHarm() {
return isHarm;
}
public void setHarm(boolean isHarm) {
this.isHarm = isHarm;
}
public boolean isRecycled() {
return isRecycled;
}
public void setRecycled(boolean isRecycled) {
this.isRecycled = isRecycled;
}
public boolean isDry() {
return isDry;
}
public void setDry(boolean isDry) {
this.isDry = isDry;
}
public boolean isWet() {
return isWet;
}
public void setWet(boolean isWet) {
this.isWet = isWet;
}
}
/*
* 过滤标准的接口,即抽象过滤角色
*/
public interface Criteria {
//定义过滤的标准
List<Rubbish> rubbishFilter(List<Rubbish> rubbishs);
}
/*
* 实现Criteria接口的实体类
*/
//干垃圾
public class DryRubbishCriteria implements Criteria {
@Override
public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) {
List<Rubbish> rubbishList=new ArrayList<Rubbish>();
for(Rubbish rubbish:rubbishs) {
//这里只过滤出所有干垃圾
if (rubbish.isDry()) {
rubbishList.add(rubbish);
}
}
return rubbishList;
}
}
//有害垃圾
public class HarmfulRubbishCriteria implements Criteria {
@Override
public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) {
List<Rubbish> rubbishList=new ArrayList<Rubbish>();
for(Rubbish rubbish:rubbishs) {
//这里只过滤出所有干垃圾
if (rubbish.isHarm()) {
rubbishList.add(rubbish);
}
}
return rubbishList;
}
}
//可回收垃圾
public class RecycledRubbishCriteria implements Criteria{
@Override
public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) {
List<Rubbish> rubbishList=new ArrayList<Rubbish>();
for(Rubbish rubbish:rubbishs) {
//这里只过滤出所有干垃圾
if (rubbish.isRecycled()) {
rubbishList.add(rubbish);
}
}
return rubbishList;
}
}
//湿垃圾
public class WetRubbishCriteria implements Criteria{
@Override
public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) {
List<Rubbish> rubbishList=new ArrayList<Rubbish>();
for(Rubbish rubbish:rubbishs) {
//这里只过滤出所有干垃圾
if (rubbish.isWet()) {
rubbishList.add(rubbish);
}
}
return rubbishList;
}
}测试结果如下:
//使用不同的标准(Criteria)来过滤Rubbish对象的列表
public class Main {
public static void main(String[] args) {
//原始数据集合
List<Rubbish> rubbishList = new ArrayList<Rubbish>();
rubbishList.add(new Rubbish("果壳", false, false, true, false));
rubbishList.add(new Rubbish("陶瓷", false, false, true, false));
rubbishList.add(new Rubbish("菜根菜叶", false, false, false, true));
rubbishList.add(new Rubbish("果皮", false, false, false, true));
rubbishList.add(new Rubbish("电池", true, false, false, false));
rubbishList.add(new Rubbish("水银温度计", true, false, false, false));
rubbishList.add(new Rubbish("灯泡", true, false, false, false));
rubbishList.add(new Rubbish("废纸塑料", false, true,false, false));
rubbishList.add(new Rubbish("金属和布料", false, true, false, false));
//四种不同的过滤标准
Criteria dryRubbishCriteria=new DryRubbishCriteria();
Criteria wetRubbishCriteria=new WetRubbishCriteria();
Criteria harRubbishCriteria=new HarmfulRubbishCriteria();
Criteria recycledRubbishCriteria=new RecycledRubbishCriteria();
System.out.println("干垃圾:");
printRubbishes(dryRubbishCriteria.rubbishFilter(rubbishList));
System.out.println("湿垃圾:");
printRubbishes(wetRubbishCriteria.rubbishFilter(rubbishList));
System.out.println("有害垃圾:");
printRubbishes(harRubbishCriteria.rubbishFilter(rubbishList));
System.out.println("可回收垃圾:");
printRubbishes(recycledRubbishCriteria.rubbishFilter(rubbishList));
}
private static void printRubbishes(List<Rubbish> rubbishs) {
for(Rubbish rubbish:rubbishs) {
System.out.println(rubbish.getName());
}
}
}
干垃圾:
果壳
陶瓷
湿垃圾:
菜根菜叶
果皮
有害垃圾:
电池
水银温度计
灯泡
可回收垃圾:
废纸塑料
金属和布