為了留住老客戶,美運營商紛紛拿免費蘋果 iPhone 12 做營銷
阿新 • • 發佈:2021-06-08
定義:
過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組物件,通過邏輯運算以解耦的方式把它們連線起來。這種型別的設計模式屬於結構型模式,它結合多個標準來獲得單一標準。
類圖:
這張圖是網路摘的,基本上就是按這張圖寫的:
介面:
public interface Criteria { List<Person> meetCriteria(List<Person> persons); }
各種實現類,多列舉了幾個:
public class GirlCriteria implementsCriteria{ @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> girlPersons = new ArrayList<>(); for (Person person : persons) { if(person.getGender().equals("GIRL")) { girlPersons.add(person); } }return girlPersons; } }
public class BoyCriteria implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> boyPersons = new ArrayList<>(); for (Person person : persons) { if(person.getGender().equals("BOY")) { boyPersons.add(person); } }return boyPersons; } }
public class SingleCriteria implements Criteria { @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> singlePersons = new ArrayList<>(); for (Person person : persons) { if(person.getStatus().equals("SINGLE")) { singlePersons.add(person); } } return singlePersons; } }
//同時滿足這兩個條件的 public class AndCriteria implements Criteria { private Criteria c1; private Criteria c2; public AndCriteria (Criteria c1, Criteria c2) { this.c1 = c1; this.c2 = c2; } @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> c1Person = c1.meetCriteria(persons); List<Person> andPerson = c2.meetCriteria(c1Person); return andPerson; } }
// 滿足條件之一的 public class OrCriteria implements Criteria { private Criteria c1; private Criteria c2; public OrCriteria(Criteria c1, Criteria c2) { this.c1 = c1; this.c2 = c2; } @Override public List<Person> meetCriteria(List<Person> persons) { List<Person> list1 = c1.meetCriteria(persons); List<Person> list2 = c2.meetCriteria(persons); for (Person person : list2) { if (!list1.contains(person)) { list1.add(person); } } return list1; } }
測試類:
public class TestCriteria { public static void main(String[] args) { List<Person> persons = new ArrayList<Person>(); persons.add(new Person("Robert", "BOY", "SINGLE")); persons.add(new Person("John", "BOY", "MARRIED")); persons.add(new Person("Laura", "GIRL", "MARRIED")); persons.add(new Person("Diana", "GIRL", "SINGLE")); persons.add(new Person("Mike", "BOY", "SINGLE")); persons.add(new Person("Bobby", "BOY", "SINGLE")); // 過濾只有BOY的 System.out.println("boy:"); List<Person> list1 = new BoyCriteria().meetCriteria(persons); printList(list1); // 過濾只有GIRL的 System.out.println("girl:"); List<Person> list2 = new GirlCriteria().meetCriteria(persons); printList(list2); // 過濾只有SINGLE的 System.out.println("single:"); List<Person> list3 = new SingleCriteria().meetCriteria(persons); printList(list3); // 過濾BOY並且SINGLE的 System.out.println("boy and single:"); BoyCriteria c1 = new BoyCriteria(); SingleCriteria c2 = new SingleCriteria(); List<Person> list4 = new AndCriteria(c1, c2).meetCriteria(persons); printList(list4); // 過濾GIRL或者SINGLE的 GirlCriteria c3 = new GirlCriteria(); SingleCriteria c4 = new SingleCriteria(); System.out.println("girl or single:"); List<Person> list5 = new OrCriteria(c3, c4).meetCriteria(persons); printList(list5); } public static void printList(List<Person> list) { for (Person person : list) { System.out.println(person); } } }
測試結果: