1、模式簡介
過濾器模式(Filter)也叫標准模式(Criteria),這種模式允許開發人員使用不同的標准來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。
2、實例
這個實例的需求如下:
Person類有三個屬性:姓名(Name)、性別(Gender)和婚姻情況(Marital),我們的系統中的一些功能需要對這些屬性進行篩選,比如:
- 得到所有的男性;
- 得到所有的女性;
- 得到所有還單身的人;
- 得到所有已婚的人。
系統還希望能夠將這些條件組合起來進行篩選,比如:
- 得到所有已婚男性;
- 得到所有單身女性;
- 得到所有已婚的人或女性;
分析:
要解決這個問題,我們可以使用過濾器模式。
代碼:
Person類中的代碼:
public class Person { private String name; // 姓名 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; } @Override public String toString() { return "Person [name=" + name + ",gender=" + gender + ", marital=" + marital + "]"; } }
Filter接口中的代碼:
public interface Filter { // 根據傳過來的Person列表,根據一定的條件過濾,得到目標集合 List<Person> filter(List<Person> persons); }
MaleFilter類中的代碼:
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; } }
處理“並且”邏輯的過濾器類FilterAnd類中的代碼:
public class FilterAnd implements Filter { private Filter filter; private Filter otherFilter; public FilterAnd(Filter filter, Filter otherFilter) { this.filter = filter; this.otherFilter = otherFilter; } @Override public List<Person> filter(List<Person> persons) { List<Person> tmpList = filter.filter(persons); return otherFilter.filter(tmpList); } }
處理“或者”邏輯的過濾器類FilterOr類中的代碼:
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; } }
測試類Test中的代碼:
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("---------------------所有男性---------------------"); List<Person> maleList = new MaleFilter().filter(persons); printList(maleList); // 打印出所有單身的信息 System.out.println("---------------------所有單身---------------------"); List<Person> singleList = new SingleFilter().filter(persons); printList(singleList); // 打印出所有已婚女性的信息 System.out.println("--------------------所有已婚女性-------------------"); List<Person> marriedFemaleList = new FilterAnd(new MarriedFilter(), new FemaleFilter()).filter(persons); printList(marriedFemaleList); // 打印出所有單身或女性的信息 System.out.println("-------------------所有單身或女性------------------"); List<Person> singleOrFemaleList = new FilterOr(new SingleFilter(), new FemaleFilter()).filter(persons); printList(singleOrFemaleList); } // 打印列表中的數據信息 private static void printList(List<Person> list) { for (Person person : list) { System.out.println(person.toString()); } } }
測試代碼如下圖所示:
最后貼出過濾器模式的GitHub代碼:【GitHub - Filter】。