135 lines
3.3 KiB
Dart
135 lines
3.3 KiB
Dart
|
/**
|
|||
|
过滤器模式(Filter Pattern)
|
|||
|
|
|||
|
允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
|
|||
|
这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。
|
|||
|
*/
|
|||
|
main(List<String> args) {
|
|||
|
List<Person> persons = List<Person>();
|
|||
|
|
|||
|
persons.add(Person("Robert", "Male", "Single"));
|
|||
|
persons.add(Person("John", "Male", "Married"));
|
|||
|
persons.add(Person("Laura", "Female", "Married"));
|
|||
|
persons.add(Person("Diana", "Female", "Single"));
|
|||
|
persons.add(Person("Mike", "Male", "Single"));
|
|||
|
persons.add(Person("Bobby", "Male", "Single"));
|
|||
|
|
|||
|
Filter male = MaleFilter();
|
|||
|
Filter female = FemaleFilter();
|
|||
|
Filter single = SingleFilter();
|
|||
|
Filter singleMale = AndFilter(single, male);
|
|||
|
Filter singleOrFemale = OrFilter(single, female);
|
|||
|
|
|||
|
print("Males: ");
|
|||
|
male.filter(persons).forEach((p) => print(p));
|
|||
|
|
|||
|
print("\nFemales: ");
|
|||
|
female.filter(persons).forEach((p) => print(p));
|
|||
|
|
|||
|
print("\nSingle Males: ");
|
|||
|
singleMale.filter(persons).forEach((p) => print(p));
|
|||
|
|
|||
|
print("\nSingle Or Females: ");
|
|||
|
singleOrFemale.filter(persons).forEach((p) => print(p));
|
|||
|
}
|
|||
|
|
|||
|
//////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
///
|
|||
|
/// 创建一个类,在该类上应用过滤器
|
|||
|
///
|
|||
|
class Person {
|
|||
|
String name;
|
|||
|
String gender;
|
|||
|
String maritalStatus;
|
|||
|
|
|||
|
Person(this.name, this.gender, this.maritalStatus);
|
|||
|
|
|||
|
@override
|
|||
|
String toString() {
|
|||
|
return 'Person[name="$name", gender="$gender", maritalStatus="$maritalStatus"]';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
///
|
|||
|
/// 创建一个过滤器接口
|
|||
|
///
|
|||
|
abstract class Filter {
|
|||
|
List<Person> filter(List<Person> persons);
|
|||
|
}
|
|||
|
|
|||
|
///
|
|||
|
/// 创建实现了 Filter 接口的实体类
|
|||
|
///
|
|||
|
class MaleFilter implements Filter {
|
|||
|
@override
|
|||
|
List<Person> filter(List<Person> persons) {
|
|||
|
List<Person> personList = List<Person>();
|
|||
|
for (Person person in persons) {
|
|||
|
if (person.gender.toUpperCase() == "MALE") {
|
|||
|
personList.add(person);
|
|||
|
}
|
|||
|
}
|
|||
|
return personList;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class FemaleFilter implements Filter {
|
|||
|
@override
|
|||
|
List<Person> filter(List<Person> persons) {
|
|||
|
List<Person> personList = List<Person>();
|
|||
|
for (Person person in persons) {
|
|||
|
if (person.gender.toUpperCase() == "FEMALE") {
|
|||
|
personList.add(person);
|
|||
|
}
|
|||
|
}
|
|||
|
return personList;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class SingleFilter implements Filter {
|
|||
|
@override
|
|||
|
List<Person> filter(List<Person> persons) {
|
|||
|
List<Person> personList = List<Person>();
|
|||
|
for (Person person in persons) {
|
|||
|
if (person.maritalStatus.toUpperCase() == "SINGLE") {
|
|||
|
personList.add(person);
|
|||
|
}
|
|||
|
}
|
|||
|
return personList;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class AndFilter implements Filter {
|
|||
|
Filter _filter1;
|
|||
|
Filter _filter2;
|
|||
|
|
|||
|
AndFilter(this._filter1, this._filter2);
|
|||
|
|
|||
|
@override
|
|||
|
List<Person> filter(List<Person> persons) {
|
|||
|
List<Person> personList = _filter1.filter(persons);
|
|||
|
return _filter2.filter(personList);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class OrFilter implements Filter {
|
|||
|
Filter _filter1;
|
|||
|
Filter _filter2;
|
|||
|
|
|||
|
OrFilter(this._filter1, this._filter2);
|
|||
|
|
|||
|
@override
|
|||
|
List<Person> filter(List<Person> persons) {
|
|||
|
List<Person> personList1 = _filter1.filter(persons);
|
|||
|
List<Person> personList2 = _filter1.filter(persons);
|
|||
|
|
|||
|
for (Person person in personList2) {
|
|||
|
if (!personList1.contains(person)) {
|
|||
|
personList1.add(person);
|
|||
|
}
|
|||
|
}
|
|||
|
return personList1;
|
|||
|
}
|
|||
|
}
|