導(dǎo)言
在軟件開發(fā)中,我們常常需要對大量的數(shù)據(jù)進(jìn)行篩選或過濾。例如,在一個電子商務(wù)網(wǎng)站中,我們可能需要根據(jù)用戶的喜好、價格區(qū)間、商品類型等條件來篩選出符合用戶需求的商品列表。為了實現(xiàn)這樣的功能,過濾器模式就派上了用場。
什么是過濾器模式?
過濾器模式是一種結(jié)構(gòu)型設(shè)計模式,它允許我們使用不同的條件從數(shù)據(jù)集合中篩選出滿足特定條件的數(shù)據(jù)子集。它將篩選條件和數(shù)據(jù)集合分離,使得二者可以獨(dú)立變化而互不影響。
過濾器模式的組成部分
過濾器接口(Filter):定義了過濾器的基本方法,在實際應(yīng)用中可以擴(kuò)展該接口以適應(yīng)不同的過濾條件。
具體過濾器(ConcreteFilter):實現(xiàn)過濾器接口,根據(jù)具體的條件對數(shù)據(jù)進(jìn)行過濾。
過濾器鏈(FilterChain):將多個過濾器按照一定的順序組合起來,形成一個過濾器鏈,依次對數(shù)據(jù)進(jìn)行過濾。
過濾器模式的應(yīng)用場景
過濾器模式在很多實際場景中都有應(yīng)用,例如:文章來源:http://www.zghlxwxcb.cn/news/detail-659317.html
- 數(shù)據(jù)查詢:在數(shù)據(jù)庫查詢中,我們可以使用過濾器模式根據(jù)不同的條件對查詢結(jié)果進(jìn)行過濾,提高查詢效率。
- 日志過濾:在日志系統(tǒng)中,我們可以使用過濾器模式根據(jù)級別、關(guān)鍵詞等條件對日志進(jìn)行過濾,方便問題排查與分析。
- 圖像處理:在圖像處理中,我們可以使用過濾器模式根據(jù)不同的條件對圖像進(jìn)行濾波、增強(qiáng)等操作。
過濾器模式的實現(xiàn)
步驟 1
創(chuàng)建一個類,在該類上應(yīng)用標(biāo)準(zhǔn)。
Person.java
public class Person {
private String name;
private String gender;
private String maritalStatus;
public Person(String name,String gender,String maritalStatus){
this.name = name;
this.gender = gender;
this.maritalStatus = maritalStatus;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public String getMaritalStatus() {
return maritalStatus;
}
}
步驟 2
為標(biāo)準(zhǔn)(Criteria)創(chuàng)建一個接口。
Criteria.java
import java.util.List;
public interface Criteria {
public List<Person> meetCriteria(List<Person> persons);
}
步驟 3
創(chuàng)建實現(xiàn)了 Criteria 接口的實體類。
CriteriaMale.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaMale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> malePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getGender().equalsIgnoreCase("MALE")){
malePersons.add(person);
}
}
return malePersons;
}
}
CriteriaFemale.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaFemale implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> femalePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getGender().equalsIgnoreCase("FEMALE")){
femalePersons.add(person);
}
}
return femalePersons;
}
}
CriteriaSingle.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaSingle implements Criteria {
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> singlePersons = new ArrayList<Person>();
for (Person person : persons) {
if(person.getMaritalStatus().equalsIgnoreCase("SINGLE")){
singlePersons.add(person);
}
}
return singlePersons;
}
}
AndCriteria.java
import java.util.List;
public class AndCriteria implements Criteria {
private Criteria criteria;
private Criteria otherCriteria;
public AndCriteria(Criteria criteria, Criteria otherCriteria) {
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> firstCriteriaPersons = criteria.meetCriteria(persons);
return otherCriteria.meetCriteria(firstCriteriaPersons);
}
}
OrCriteria.java
import java.util.List;
public class OrCriteria implements Criteria {
private Criteria criteria;
private Criteria otherCriteria;
public OrCriteria(Criteria criteria, Criteria otherCriteria) {
this.criteria = criteria;
this.otherCriteria = otherCriteria;
}
@Override
public List<Person> meetCriteria(List<Person> persons) {
List<Person> firstCriteriaItems = criteria.meetCriteria(persons);
List<Person> otherCriteriaItems = otherCriteria.meetCriteria(persons);
for (Person person : otherCriteriaItems) {
if(!firstCriteriaItems.contains(person)){
firstCriteriaItems.add(person);
}
}
return firstCriteriaItems;
}
}
步驟4
使用不同的標(biāo)準(zhǔn)(Criteria)和它們的結(jié)合來過濾 Person 對象的列表。
CriteriaPatternDemo.java
import java.util.ArrayList;
import java.util.List;
public class CriteriaPatternDemo {
public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("Robert","Male", "Single"));
persons.add(new Person("John","Male", "Married"));
persons.add(new Person("Laura","Female", "Married"));
persons.add(new Person("Diana","Female", "Single"));
persons.add(new Person("Mike","Male", "Single"));
persons.add(new Person("Bobby","Male", "Single"));
Criteria male = new CriteriaMale();
Criteria female = new CriteriaFemale();
Criteria single = new CriteriaSingle();
Criteria singleMale = new AndCriteria(single, male);
Criteria singleOrFemale = new OrCriteria(single, female);
System.out.println("Males: ");
printPersons(male.meetCriteria(persons));
System.out.println("\nFemales: ");
printPersons(female.meetCriteria(persons));
System.out.println("\nSingle Males: ");
printPersons(singleMale.meetCriteria(persons));
System.out.println("\nSingle Or Females: ");
printPersons(singleOrFemale.meetCriteria(persons));
}
public static void printPersons(List<Person> persons){
for (Person person : persons) {
System.out.println("Person : [ Name : " + person.getName()
+", Gender : " + person.getGender()
+", Marital Status : " + person.getMaritalStatus()
+" ]");
}
}
}
步驟 5
執(zhí)行程序,輸出結(jié)果:
Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : John, Gender : Male, Marital Status : Married ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Females:
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Single Males:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Single Or Females:
Person : [ Name : Robert, Gender : Male, Marital Status : Single ]
Person : [ Name : Diana, Gender : Female, Marital Status : Single ]
Person : [ Name : Mike, Gender : Male, Marital Status : Single ]
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ]
Person : [ Name : Laura, Gender : Female, Marital Status : Married ]
這段代碼展示了一個使用標(biāo)準(zhǔn)模式(Criteria Pattern)的例子。標(biāo)準(zhǔn)模式用于按照特定的標(biāo)準(zhǔn)篩選對象。
步驟1中定義了一個名為Person的類,該類具有name、gender和maritalStatus屬性,并提供了相應(yīng)的構(gòu)造函數(shù)和訪問方法。
步驟2中定義了一個名為Criteria的接口,該接口包含一個meetCriteria方法,用于根據(jù)特定的標(biāo)準(zhǔn)篩選Person對象。
步驟3中定義了幾個實現(xiàn)了Criteria接口的類,分別用于篩選男性、女性和單身人士的Person對象。還定義了AndCriteria和OrCriteria類,用于組合不同的標(biāo)準(zhǔn)進(jìn)行篩選。
步驟4中使用不同的標(biāo)準(zhǔn)和它們的組合來過濾Person對象的列表。在示例中,創(chuàng)建了一個包含多個Person對象的列表,然后使用不同的標(biāo)準(zhǔn)對該列表進(jìn)行篩選,并打印出符合相應(yīng)標(biāo)準(zhǔn)的Person對象。
步驟5中執(zhí)行程序,根據(jù)不同的標(biāo)準(zhǔn)篩選并輸出結(jié)果??梢钥吹剑鶕?jù)不同的標(biāo)準(zhǔn)篩選后,輸出的Person對象列表符合對應(yīng)的要求。
標(biāo)準(zhǔn)模式可以很好地實現(xiàn)對象的篩選和過濾,提供了靈活性和可擴(kuò)展性,使得篩選邏輯與具體對象的實現(xiàn)解耦。這對于需要根據(jù)不同的標(biāo)準(zhǔn)進(jìn)行篩選的應(yīng)用場景非常有用。
結(jié)語
過濾器模式是一種簡單而強(qiáng)大的軟件設(shè)計模式,它可以幫助我們靈活地篩選數(shù)據(jù),并將過濾條件與數(shù)據(jù)集合解耦。通過本篇博客的學(xué)習(xí),讀者可以了解到過濾器模式的基本概念、應(yīng)用場景和實現(xiàn)方式,并通過實例演示掌握其具體使用方法。希望本文對您深入理解過濾器模式有所幫助,并能在實際開發(fā)中靈活運(yùn)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-659317.html
到了這里,關(guān)于設(shè)計模式詳解-過濾器模式(標(biāo)準(zhǔn)模式)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!