【設計模式 - 7】之過濾器模式(Filter)


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】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM