过滤器模式

过滤器模式(标准模式)

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

案例

Person类有三个属性:姓名(Name)、性别(Gender)和婚姻情况(Marital),我们的系统中的一些功能需要对这些属性进行筛选,比如:

  1. 得到所有的男性;
  2. 得到所有的女性;
  3. 得到所有还单身的人;
  4. 得到所有已婚的人。

系统还希望能够将这些条件组合起来进行筛选,比如:

  1. 得到所有已婚男性;
  2. 得到所有单身女性;
  3. 得到所有已婚的人或女性;
public class Person {
	private String name; // 姓名
	private String gender; // 年龄
	private String marital; // 婚姻状况

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public String getMarital() {
		return marital;
	}

	public void setMarital(String marital) {
		this.marital = marital;
	}

	public Person(String name, String gender, String marital) {
		super();
		this.name = name;
		this.gender = gender;
		this.marital = marital;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", gender=" + gender + ", marital=" + marital + "] \r";
	}

}
import java.util.List;

public interface Filter {
	/**
	 * 对传过来的person列表,根据一定条件进行过滤
	 * @param persons
	 * @return
	 */
	List<Person> filter(List<Person> persons);
}
import java.util.ArrayList;
import java.util.List;

public class MaleFilter implements Filter {

	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> result = new ArrayList<>();
		for (Person person : persons) {
			if ("MALE".equalsIgnoreCase(person.getGender())) {  
	            result.add(person);  
	         }
		}
		return result;
	}

}
import java.util.ArrayList;
import java.util.List;

public class SingleFilter implements Filter {

	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> result = new ArrayList<>();
		for (Person person : persons) {
			if ("SINGLE".equalsIgnoreCase(person.getMarital())) {  
	            result.add(person);  
	         }
		}
		return result;
	}

}
import java.util.List;

public class FilterAnd implements Filter {
	private Filter filter;
	private Filter otherFilter;

	public FilterAnd(Filter filter, Filter otherFilter) {
		super();
		this.filter = filter;
		this.otherFilter = otherFilter;
	}

	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> tempList = filter.filter(persons);
		return otherFilter.filter(tempList);
	}

	
}
import java.util.List;

public class FilterOr implements Filter {
	private Filter filter;
	private Filter otherFilter;

	public FilterOr(Filter filter, Filter otherFilter) {
		this.filter = filter;
		this.otherFilter = otherFilter;
	}

	@Override
	public List<Person> filter(List<Person> persons) {
		 List<Person> tmpList1 = filter.filter(persons);  
	      List<Person> tmpList2 = otherFilter.filter(persons);  
	      for (Person person : tmpList2) {  
	         if (!tmpList1.contains(person)) {  
	            tmpList1.add(person);  
	         }  
	      }  
	      return tmpList1;  
	}
}
import java.util.ArrayList;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		// 初始化数据
		List<Person> persons = new ArrayList<>();
		persons.add(new Person("霍一", "FEMALE", "MARRIED"));
		persons.add(new Person("邓二", "MALE", "MARRIED"));
		persons.add(new Person("张三", "MALE", "SINGLE"));
		persons.add(new Person("李四", "FEMALE", "MARRIED"));
		persons.add(new Person("王五", "MALE", "SINGLE"));
		persons.add(new Person("赵六", "FEMALE", "SINGLE"));
		persons.add(new Person("孙七", "MALE", "SINGLE"));
		persons.add(new Person("罗八", "MALE", "MARRIED"));
		persons.add(new Person("刘九", "FEMALE", "SINGLE"));
		persons.add(new Person("史十", "FEMALE", "SINGLE"));

		// 所有男性
		System.out.println("男性===========================");
		System.out.println(new MaleFilter().filter(persons));
		System.out.println("单身===========================");
		System.out.println(new SingleFilter().filter(persons));
		System.out.println("单身男性===========================");
		System.out.println(new FilterAnd(new MaleFilter(), new SingleFilter()).filter(persons));
		System.out.println("单身或男性===========================");
		System.out.println(new FilterOr(new MaleFilter(), new SingleFilter()).filter(persons));
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值