简介:这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
在本例中,以水果作为过滤的对象。水果的颜色和口味各有差别。有时我们只需要酸味的水果,有时只需要黄色的水果,这种情况下,就需要用到过滤器模式,根据一定的标准进行筛选。
/**
*创建一个水果类,属性包括名称,口味和颜色
*/
public class Fruit {
private String name;
private String taste;
private String color;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTaste() {
return taste;
}
public void setTaste(String taste) {
this.taste = taste;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Fruit(String name, String taste, String color) {
super();
this.name = name;
this.taste = taste;
this.color = color;
}
@Override
public String toString() {
return "Fruit [name=" + name + ", taste=" + taste + ", color=" + color + "]";
}
}
/**
*定义一个接口,过滤的标准
*/
interface Criterion{
List<Fruit> chooseCri(List<Fruit> list);
}
/**
*过滤红色的水果
*/
class RedCri implements Criterion{
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits=new LinkedList<>();
for (Fruit fruit : list) {
if(fruit.getColor().equalsIgnoreCase("red")){
fruits.add(fruit);
}
}
return fruits;
}
}
/**
*过滤黄色的水果
*/
class YellowCri implements Criterion{
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits=new LinkedList<>();
for (Fruit fruit : list) {
if(fruit.getColor().equalsIgnoreCase("yellow")){
fruits.add(fruit);
}
}
return fruits;
}
}
/**
*过滤甜味的水果
*/
class SweetCri implements Criterion{
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits=new LinkedList<>();
for (Fruit fruit : list) {
if(fruit.getTaste().equalsIgnoreCase("sweet")){
fruits.add(fruit);
}
}
return fruits;
}
}
/**
*过滤酸味的水果
*/
class SourCri implements Criterion{
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits=new LinkedList<>();
for (Fruit fruit : list) {
if(fruit.getTaste().equalsIgnoreCase("sour")){
fruits.add(fruit);
}
}
return fruits;
}
}
/**
* “与”条件,同时需要满足两个筛选条件。
*/
class AddCri implements Criterion{
private Criterion criA;
private Criterion criB;
public AddCri(Criterion criA, Criterion criB) {
super();
this.criA = criA;
this.criB = criB;
}
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits=criA.chooseCri(list);
return criB.chooseCri(fruits);
}
}
/**
*或条件,只要满足其中一个条件即可
*/
class OrCri implements Criterion{
private Criterion criA;
private Criterion criB;
public OrCri(Criterion criA, Criterion criB) {
super();
this.criA = criA;
this.criB = criB;
}
@Override
public List<Fruit> chooseCri(List<Fruit> list) {
List<Fruit> fruits1=criA.chooseCri(list);
List<Fruit> fruits2=criB.chooseCri(list);
for (Fruit fruit : fruits1) {
if(!fruits2.contains(fruit)){
fruits2.add(fruit);
}
}
return fruits2;
}
}
主方法:
public class Main {
public static void main(String[] args) {
List<Fruit> fruits=new LinkedList<>();
fruits.add(new Fruit("橘子", "sour", "yellow"));
fruits.add(new Fruit("香蕉", "sweet", "yellow"));
fruits.add(new Fruit("梨", "sweet", "yellow"));
fruits.add(new Fruit("苹果", "sweet", "red"));
fruits.add(new Fruit("西红柿", "sour", "red"));
fruits.add(new Fruit("西瓜", "sweet", "red"));
fruits.add(new Fruit("哈密瓜", "sweet", "yellow"));
fruits.add(new Fruit("樱桃", "sour", "red"));
//所有的红色水果
List<Fruit> redFruit=new RedCri().chooseCri(fruits);
//所有的黄色水果
List<Fruit> yellowFruit=new YellowCri().chooseCri(fruits);
//所有的酸味水果
List<Fruit> sourFruit=new SourCri().chooseCri(fruits);
//所有的甜味水果
List<Fruit> sweetFruit=new SweetCri().chooseCri(fruits);
System.err.println("所有的甜味水果"+sweetFruit);
//既是红色又是甜味的水果
List<Fruit> redAndsweet=new AddCri(new RedCri(),new SweetCri()).chooseCri(fruits);
//红色或者甜味的水果
List<Fruit> redOrsweet=new OrCri(new RedCri(),new SweetCri()).chooseCri(fruits);
System.err.println("红色甜味的水果"+redAndsweet);
System.err.println("红色或者甜味的水果"+redOrsweet);
}
}
运行结果:
所有的甜味水果[Fruit [name=香蕉, taste=sweet, color=yellow], Fruit [name=梨, taste=sweet, color=yellow], Fruit [name=苹果, taste=sweet, color=red], Fruit [name=西瓜, taste=sweet, color=red], Fruit [name=哈密瓜, taste=sweet, color=yellow]]
红色甜味的水果[Fruit [name=苹果, taste=sweet, color=red], Fruit [name=西瓜, taste=sweet, color=red]]
红色或者甜味的水果[Fruit [name=香蕉, taste=sweet, color=yellow], Fruit [name=梨, taste=sweet, color=yellow], Fruit [name=苹果, taste=sweet, color=red], Fruit [name=西瓜, taste=sweet, color=red], Fruit [name=哈密瓜, taste=sweet, color=yellow], Fruit [name=西红柿, taste=sour, color=red], Fruit [name=樱桃, taste=sour, color=red]]