[Design Pattern] Filter Pattern

Filter còn có tên gọi khác là Criteria. Cả 2 cách gọi này đều có nghĩa là sàng lọc hay màng lọc. Filter được xếp vào nhóm các pattern Kiến Trúc. Áp dụng triển khai Chúng ta có 1 danh sách người dùng được tạo bởi class Person. Để lọc danh sách này theo những

Filter còn có tên gọi khác là Criteria. Cả 2 cách gọi này đều có nghĩa là sàng lọc hay màng lọc. Filter được xếp vào nhóm các pattern Kiến Trúc.

Áp dụng triển khai

sơ đồ các class

  • Chúng ta có 1 danh sách người dùng được tạo bởi class Person.
  • Để lọc danh sách này theo những tiêu chí khác nhau, chúng ta tạo ra một giao diện Filter và các class triển khai.
  • Code main tại PatternDemo sẽ sử dụng các object Filter để lọc danh sách List<Person> theo các tiêu chí.

Bước 1

Tạo class Person để mô tả người dùng.

filterperson/Person.java

packagefilterperson;publicclassPerson{privateString name;privateString gender;privateString status;publicPerson(String name,String gender,String status
   ){this.name = name;this.gender = gender;this.status = status;}publicStringgetName(){return name;}publicStringgetGender(){return gender;}publicStringgetStatus(){return status;}}

Bước 2

Tạo giao diện Filter.

filterperson/Filter.java

packagefilterperson;importjava.util.List;publicinterfaceFilter{publicList<Person>match(List<Person> personList);}

Bước 3

Tạo các class triển khai giao diện Filter.

filterperson/FilterMale.java

packagefilterperson;importjava.util.ArrayList;importjava.util.List;publicclassFilterMaleimplementsFilter{@OverridepublicList<Person>match(List<Person> personList){List<Person> males =newArrayList<Person>();for(Person p : personList)if(p.getGender().equalsIgnoreCase("male"))
            males.add(p);return males;}}

filterperson/FilterFemale.java

packagefilterperson;importjava.util.ArrayList;importjava.util.List;publicclassFilterFemaleimplementsFilter{@OverridepublicList<Person>match(List<Person> personList){List<Person> females =newArrayList<Person>();for(Person p : personList)if(p.getGender().equalsIgnoreCase("female"))
            females.add(p);return females;}}

filterperson/FilterSingle.java

packagefilterperson;importjava.util.ArrayList;importjava.util.List;publicclassFilterSingleimplementsFilter{@OverridepublicList<Person>match(List<Person> personList){List<Person> singles =newArrayList<Person>();for(Person p : personList)if(p.getStatus().equalsIgnoreCase("single"))
            singles.add(p);return singles;}}

filterperson/FilterAnd.java

packagefilterperson;importjava.util.List;publicclassFilterAndimplementsFilter{privateFilter firstFilter;privateFilter secondFilter;publicFilterAnd(Filter firstFilter,Filter secondFilter
   ){this.firstFilter = firstFilter;this.secondFilter = secondFilter;}@OverridepublicList<Person>match(List<Person> personList){List<Person> firstMatched = firstFilter.match(personList);return secondFilter.match(firstMatched);}}

filterperson/FilterOr.java

packagefilterperson;importjava.util.List;publicclassFilterOrimplementsFilter{privateFilter firstFilter;privateFilter secondFilter;publicFilterOr(Filter firstFilter,Filter secondFilter
   ){this.firstFilter = firstFilter;this.secondFilter = secondFilter;}@OverridepublicList<Person>match(List<Person> personList){List<Person> firstMatched = firstFilter.match(personList);List<Person> secondMatched = secondFilter.match(personList);for(Person p : secondMatched)if(! firstMatched.contains(p))
            firstMatched.add(p);return firstMatched;}}

Bước 4

Sử dụng các object Filter khác nhau và kết hợp để lọc danh sách người dùng.

PatternDemo.java

importfilterperson.*;importjava.util.ArrayList;importjava.util.List;publicclassPatternDemo{publicstaticvoidmain(String[] args){List<Person> personList =newArrayList<Person>();

      personList.add(newPerson("Robert","Male","Single"));
      personList.add(newPerson("John","Male","Married"));
      personList.add(newPerson("Laura","Female","Married"));
      personList.add(newPerson("Diana","Female","Single"));
      personList.add(newPerson("Mike","Male","Single"));
      personList.add(newPerson("Bobby","Male","Single"));Filter filterMale =newFilterMale();Filter filterFemale =newFilterFemale();Filter filterSingle =newFilterSingle();Filter filterSingleAndMale =newFilterAnd(filterSingle, filterMale);Filter filterSingleOrFemale =newFilterOr(filterSingle, filterFemale);System.out.println("MALE:");print(filterMale.match(personList));System.out.println("FEMALE:");print(filterFemale.match(personList));System.out.println("SINGLE and MALE:");print(filterSingleAndMale.match(personList));System.out.println("SINGLE or FEMALE");print(filterSingleOrFemale.match(personList));}publicstaticvoidprint(List<Person> personList){for(Person p : personList){System.out.println("[ Name: "+ p.getName()+", Gender: "+ p.getGender()+", Status: "+ p.getStatus()+" ]");}}}

Bước 5

Kiểm chứng lại kết quả được in ra trong console.

console

MALE:[Name:Robert,Gender:Male,Status:Single][Name:John,Gender:Male,Status:Married][Name:Mike,Gender:Male,Status:Single][Name:Bobby,Gender:Male,Status:Single]
FEMALE:[Name:Laura,Gender:Female,Status:Married][Name:Diana,Gender:Female,Status:Single]
SINGLE and MALE:[Name:Robert,Gender:Male,Status:Single][Name:Mike,Gender:Male,Status:Single][Name:Bobby,Gender:Male,Status:Single]
SINGLE or FEMALE
[Name:Robert,Gender:Male,Status:Single][Name:Diana,Gender:Female,Status:Single][Name:Mike,Gender:Male,Status:Single][Name:Bobby,Gender:Male,Status:Single][Name:Laura,Gender:Female,Status:Married]

Nguồn: viblo.asia

Bài viết liên quan

7 Cách Tăng Tốc Ứng Dụng React Hiệu Quả Mà Bạn Có Thể Làm Ngay

React là một thư viện JavaScript phổ biến trong việc xây dựng giao diện người d

Trung Quốc “thả quân bài tẩy”: hàng loạt robot hình người!

MỘT CUỘC CÁCH MẠNG ROBOT ĐANG HÌNH THÀNH Ở TRUNG QUỐC Thượng Hải, ngày 13/5 –

9 Mẹo lập trình Web “ẩn mình” giúp tiết kiệm hàng giờ đồng hồ

Hầu hết các lập trình viên (kể cả những người giỏi) đều tốn thời gian x

Can GPT-4o Generate Images? All You Need to Know about GPT-4o-image

OpenAI‘s GPT-4o, introduced on March 25, 2025, has revolutionized the way we create visual con