赞
踩
设计模式:
前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。
正确使用设计模式具有以下优点:
可以提高程序员的思维能力、编程能力和设计能力。
使程序设计更加标准化、代码编制更加I程化,使软件开发效率大大提高,从而缩短软件的开发周期。
使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。
过滤器模式(Filter
Pattern
)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来
过滤器模式(Filter
Pattern
) 又称 标准模式(Criteria
Pattern
)
过滤器模式属于结构型模式,它结合多个标准来获得单一标准
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @ToString @NoArgsConstructor @AllArgsConstructor public class Person { /** * 名称 */ private String name; /** * 性别 */ private String gender; /** * 婚姻状况 */ private String maritalStatus; }
/**
* 过滤器,进行筛选
*/
public interface Criteria {
/**
* 筛选出符合标准的返回
* @param persons 集合
* @return 返回符合标准的集合
*/
List<Person> meetCriteria(List<Person> persons);
}
/** * 筛选出男性 */ public class CriteriaMale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> malePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getGender().equalsIgnoreCase("男")){ malePersons.add(person); } } return malePersons; } }
/** * 筛选出女性 */ public class CriteriaFemale implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> femalePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getGender().equalsIgnoreCase("女")){ femalePersons.add(person); } } return femalePersons; } }
/** * 过滤单身 */ public class CriteriaSingle implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> singlePersons = new ArrayList<Person>(); for (Person person : persons) { if(person.getMaritalStatus().equalsIgnoreCase("单身")){ singlePersons.add(person); } } return singlePersons; } }
/** * 两种条件的交集 */ public class AndCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; /** * 两种类型进行组合筛选,交集 * @param criteria 筛选条件 * @param otherCriteria 额外条件 */ public AndCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } /** * 两种条件进行组合赛选 * @param persons 集合 * @return 返回符合两种条件的集合 */ @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaPersons = criteria.meetCriteria(persons); return otherCriteria.meetCriteria(firstCriteriaPersons); } }
/** * 两种条件的合集 */ public class OrCriteria implements Criteria { private Criteria criteria; private Criteria otherCriteria; /** * 两种条件的合集 * @param criteria 筛选集合 * @param otherCriteria 筛选集合 */ public OrCriteria(Criteria criteria, Criteria otherCriteria) { this.criteria = criteria; this.otherCriteria = otherCriteria; } @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> firstCriteriaItems = criteria.meetCriteria(persons); List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons); for (Person person : otherCriteriaItems) { if(!firstCriteriaItems.contains(person)){ firstCriteriaItems.add(person); } } return firstCriteriaItems; } }
public class Main { public static void main(String[] args) { List<Person> persons = getPerson(); //男性 Criteria male = new CriteriaMale(); //单身 Criteria single = new CriteriaSingle(); //女性 CriteriaFemale criteriaFemale = new CriteriaFemale(); //交集 单身男性 AndCriteria andCriteria = new AndCriteria(single, male); //并集 单身或者男性 OrCriteria orCriteria = new OrCriteria(single, male); printPersons("女性: ", criteriaFemale.meetCriteria(persons)); printPersons("单身: ", single.meetCriteria(persons)); printPersons("单身男性: ", andCriteria.meetCriteria(persons)); printPersons("单身或是男性: ", orCriteria.meetCriteria(persons)); } /** * 初始化用户类 */ private static List<Person> getPerson() { List<Person> persons = new ArrayList<>(); persons.add(new Person("Robert", "男", "单身")); persons.add(new Person("John", "男", "结婚")); persons.add(new Person("Laura", "女", "结婚")); persons.add(new Person("Diana", "女", "单身")); persons.add(new Person("Mike", "男", "单身")); persons.add(new Person("Bobby", "男", "单身")); return persons; } /** * 输出集合 * * @param persons 集合 */ public static void printPersons(String name, List<Person> persons) { System.out.println(name); persons.forEach(person -> System.out.println(person.toString()) ); } }
女性:
Person(name=Laura, gender=女, maritalStatus=结婚)
Person(name=Diana, gender=女, maritalStatus=单身)
单身:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Diana, gender=女, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
单身男性:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
单身或是男性:
Person(name=Robert, gender=男, maritalStatus=单身)
Person(name=Diana, gender=女, maritalStatus=单身)
Person(name=Mike, gender=男, maritalStatus=单身)
Person(name=Bobby, gender=男, maritalStatus=单身)
Person(name=John, gender=男, maritalStatus=结婚)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。