java 设计模式之过滤器模式(Filter)

1.概述:

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

2.实际场景

定义一个Person类,拥有姓名(name)、性别(gender)、婚姻状况(marital)三个属性。在实际的系统运用中需要对这三个属性进行不同条件的筛选 比如:

1.获取所有的男生信息

2.获取所有的单身人信息

3.获取所有的已婚人信息

4.获取所有的单身男生信息

5.获取所有的已婚女生信息


3.示例代码

Person类

package com.ven.domain;
/**
 * perison
 * @author xiaowen
 *
 */
public class Person {

	//姓名
	private String name;
	//性别:MALE FEMALE
	private String gender;
	//婚姻状况:已婚或未婚
	private String marital;
	
	public Person(String name, String gender, String marital) {
		this.name = name;
		this.gender = gender;
		this.marital = 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;
	}
	
	
}
IFilter接口

package com.ven.service;

import java.util.List;

import com.ven.domain.Person;
/**
 * 过滤器接口
 * @author xiaowen
 *
 */
public interface IFilter {
	
	   List<Person> filter(List<Person> persons);
}
根据不同的条件实现过滤器接口

package com.ven.service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
 * 男生过滤器
 * @author xiaowen
 *
 */
public class MaleFilter implements IFilter {


	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> result = new ArrayList<>();
		List<Person> convertResult = persons.stream().filter(person->person.getGender().equals(CommonConsist.GENDER_MALE)).collect(Collectors.toList());
		convertResult.forEach(p->{result.add(p);});
		return result;
	}

}

package com.ven.service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
 * 单身过滤器
 * @author xiaowen
 *
 */
public class SingleFilter implements IFilter {


	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> result = new ArrayList<>();
		List<Person> convertResult = persons.stream().filter(person->person.getMarital().equals(CommonConsist.MARITAL_SINGLE)).collect(Collectors.toList());
		convertResult.forEach(p->{result.add(p);});
		return result;
	}

}
package com.ven.service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import com.ven.consist.CommonConsist;
import com.ven.domain.Person;
/**
 * 单身过滤器
 * @author xiaowen
 *
 */
public class MarryFilter implements IFilter {


	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> result = new ArrayList<>();
		List<Person> convertResult = persons.stream().filter(person->person.getMarital().equals(CommonConsist.MARITAL_MARRIED)).collect(Collectors.toList());
		convertResult.forEach(p->{result.add(p);});
		return result;
	}

}

package com.ven.service;

import java.util.List;

import com.ven.domain.Person;
/**
 * 处理并且逻辑的组合条件过滤器
 * @author xiaowen
 *
 */
public class FilterAnd implements IFilter {
	private IFilter filter;
	private IFilter otherFilter;
	
	
	public FilterAnd(IFilter filter, IFilter otherFilter) {
		this.filter = filter;
		this.otherFilter = otherFilter;
	}
	@Override
	public List<Person> filter(List<Person> persons) {
		List<Person> personList = filter.filter(persons);
		List<Person> result = otherFilter.filter(personList);
		return result;
	}

}
接口常量类

package com.ven.consist;
/**
 * 接口常量类
 * @author xiaowen
 *
 */
public interface CommonConsist {
	static final String GENDER_MALE="MALE";
	static final String GENDER_FEMALE="FEMALE";
	static final String  MARITAL_SINGLE="SINGLE";
	static final String  MARITAL_MARRIED="MARRIED";

}
测试

package com.ven.test;

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

import com.ven.domain.Person;
import com.ven.service.FilterAnd;
import com.ven.service.MaleFilter;
import com.ven.service.MarryFilter;
import com.ven.service.SingleFilter;
/**
 * 过滤器模式(Filter)测试
 * @author xiaowen
 *
 */
public class Test02 {
	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("---------------获取所有的男性信息------------------");
	      List<Person> maleList = new MaleFilter().filter(persons);
	      maleList.forEach(male->{
	    	  System.out.println(male.getName()+"-"+male.getGender()+"-"+male.getMarital());
	      });
	      System.out.println("---------------获取所有单身------------------");
	      List<Person> singleList = new SingleFilter().filter(persons);
	      singleList.forEach(single->{
	    	  System.out.println(single.getName()+"-"+single.getGender()+"-"+single.getMarital());
	      });
	      System.out.println("--------------------所有单身的男性-------------------");
	      List<Person> singleAndMale = new FilterAnd(new MaleFilter(), new SingleFilter()).filter(persons);
	      singleAndMale.forEach(result->{
	    	  System.out.println(result.getName()+"-"+result.getGender()+"-"+result.getMarital());
	      });
	      System.out.println("--------------------所有已婚的男性-------------------");
	      List<Person> marryList = new FilterAnd(new MaleFilter(), new MarryFilter()).filter(persons);
	      marryList.forEach(marrayAndMale->{
	    	  System.out.println(marrayAndMale.getName()+"-"+marrayAndMale.getGender()+"-"+marrayAndMale.getMarital());
	      });
}
}

控制台信息

---------------获取所有的男性信息------------------
邓二-MALE-MARRIED
张三-MALE-SINGLE
王五-MALE-SINGLE
孙七-MALE-SINGLE
罗八-MALE-MARRIED
---------------获取所有单身------------------
张三-MALE-SINGLE
王五-MALE-SINGLE
赵六-FEMALE-SINGLE
孙七-MALE-SINGLE
刘九-FEMALE-SINGLE
史十-FEMALE-SINGLE
--------------------所有单身的男性-------------------
张三-MALE-SINGLE
王五-MALE-SINGLE
孙七-MALE-SINGLE
--------------------所有已婚的男性-------------------
邓二-MALE-MARRIED
罗八-MALE-MARRIED








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值