过滤器模式
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
我们将创建一个
Person
对象、
Criteria
接口和实现了该接口的实体类,来过滤
Person
对象的列表。
CriteriaPatternDemo
类使用
Criteria
对象,基于各种标准和它们的结合来过滤
Person
对象的列表。
步骤 1
创建一个类,在该类上应用标准。
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
为标准(Criteria)创建一个接口。
Criteria.java
import
java
.
util
.
List
;
public
interface
Criteria
{
public
List
<
Person
>
meetCriteria
(
List
<
Person
>
persons
)
;
}
步骤 3
创建实现了
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
使用不同的标准(Criteria)和它们的结合来过滤
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
(
"
\n
Females:
"
)
;
printPersons
(
female
.
meetCriteria
(
persons
)
)
;
System
.
out
.
println
(
"
\n
Single Males:
"
)
;
printPersons
(
singleMale
.
meetCriteria
(
persons
)
)
;
System
.
out
.
println
(
"
\n
Single 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
执行程序,输出结果:
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 ]