这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
在本例中,以水果作为过滤的对象。水果的颜色和口味各有差别。有时我们只需要酸味的水果,有时只需要黄色的水果,这种情况下,就需要用到过滤器模式,根据一定的标准进行筛选。
/** *创建一个水果类,属性包括名称,口味和颜色 */ 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]]