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 tiêu chí khác nhau, chúng ta tạo ra một giao diện
Filter
và cácclass
triển khai. - Code
main
tạiPatternDemo
sẽ sử dụng cácobject Filter
để lọc danh sáchList<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