过滤器模式

简介:这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。

这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

在本例中,以水果作为过滤的对象。水果的颜色和口味各有差别。有时我们只需要酸味的水果,有时只需要黄色的水果,这种情况下,就需要用到过滤器模式,根据一定的标准进行筛选。

/**
 *创建一个水果类,属性包括名称,口味和颜色
 */
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]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值