フィルタパターン
フィルタモード(フィルタパターン)または標準モード(基準パターン)は、開発者がそれらを接続する方法をデカップリングするために論理演算を介して、オブジェクトのセットをフィルタリングするためのさまざまな基準を使用することを可能にする設計モデルです。 複数の条件を組み合わせた構造スキーマのデザインパターンのこのタイプは、単一の標準を得ます。
実現
私たちは、PersonオブジェクトのリストをフィルタリングするためのインタフェースのPersonオブジェクト、条件のエンティティクラスのインタフェースと実装を作成します。 CriteriaPatternDemo、私たちのデモクラスはPersonオブジェクトのリストをフィルタリングするために、様々な基準およびそれらの組み合わせに基づいて、 基準オブジェクトを、使用しています。
ステップ1
このクラスの基準の適用に、クラスを作成します。
Person.java
パブリッククラスPerson { プライベート文字列名; プライベート文字列の性別; プライベート文字列MaritalStatusの。 公共の人物(文字列名、文字列の性別、文字列MaritalStatusの){ this.name =名; this.genderは性別を=。 this.maritalStatus = MaritalStatusの。 } 公共の文字列のgetName(){ 名前を返します。 } パブリック文字列getGender(){ 性別を返します。 } パブリック文字列getMaritalStatus(){ MaritalStatusのを返します。 } }
ステップ2
標準(基準)のインターフェイスを作成します。
Criteria.java
輸入java.util.Listに。 パブリックインターフェイス基準{ 公共の一覧<人> meetCriteria(一覧<人>人)。 }
ステップ3
基準インタフェース実現エンティティクラスを作成します。
CriteriaMale.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラスCriteriaMaleは{基準を実装します @Override 公共の一覧<人> meetCriteria(一覧<人>人){ 一覧<人> malePersons =新しいのArrayList <人>(); (人の人:人)のための{ (person.getGender()。equalsIgnoreCase( "男性")){場合 malePersons.add(人)。 } } malePersonsを返します。 } }
CriteriaFemale.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラスCriteriaFemaleは{基準を実装します @Override 公共の一覧<人> meetCriteria(一覧<人>人){ 一覧<人> femalePersons =新しいのArrayList <人>(); (人の人:人)のための{ (person.getGender()。equalsIgnoreCase(「FEMALE ")){場合 femalePersons.add(人)。 } } femalePersonsを返します。 } }
CriteriaSingle.java
輸入はjava.util.ArrayList; 輸入java.util.Listに。 パブリッククラスCriteriaSingleは{基準を実装します @Override 公共の一覧<人> meetCriteria(一覧<人>人){ 一覧<人> singlePersons =新しいのArrayList <人>(); (人の人:人)のための{ (person.getMaritalStatus()。equalsIgnoreCase( "SINGLE")){場合 singlePersons.add(人)。 } } singlePersonsを返します。 } }
AndCriteria.java
輸入java.util.Listに。 パブリッククラスAndCriteriaは{基準を実装します 民間基準基準。 民間基準otherCriteria。 公共AndCriteria(基準基準、基準otherCriteria){ this.criteria =基準; this.otherCriteria = otherCriteria。 } @Override 公共の一覧<人> meetCriteria(一覧<人>人){ 一覧<人> firstCriteriaPersons = criteria.meetCriteria(人)。 otherCriteria.meetCriteria(firstCriteriaPersons)を返します。 } }
OrCriteria.java
輸入java.util.Listに。 パブリッククラスOrCriteriaは{基準を実装します 民間基準基準。 民間基準otherCriteria。 公共OrCriteria(基準基準、基準otherCriteria){ this.criteria =基準; this.otherCriteria = otherCriteria。 } @Override 公共の一覧<人> meetCriteria(一覧<人>人){ 一覧<人> firstCriteriaItems = criteria.meetCriteria(人)。 一覧<人> otherCriteriaItems = otherCriteria.meetCriteria(人)。 {:(otherCriteriaItems人の人)のために 場合(!firstCriteriaItems.contains(人)){ firstCriteriaItems.add(人)。 } } firstCriteriaItemsを返します。 } }
ステップ4
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
出力を確認します。
男性: 人:[名:Robert、性別:男性、婚姻状況:独身] 人:[名:ジョン、性別:男性、婚姻状況:既婚] 人:[名:マイク、性別:男性、婚姻状況:独身] 人:[名:ボビー、性別:男性、婚姻状況:独身] 女性: 人:[名前:ローラ、性別:女性、婚姻状況:既婚] 人:[名:ダイアナ、性別:女性、婚姻状況:独身] シングル男性: 人:[名:Robert、性別:男性、婚姻状況:独身] 人:[名:マイク、性別:男性、婚姻状況:独身] 人:[名:ボビー、性別:男性、婚姻状況:独身] シングルまたは女性: 人:[名:Robert、性別:男性、婚姻状況:独身] 人:[名:ダイアナ、性別:女性、婚姻状況:独身] 人:[名:マイク、性別:男性、婚姻状況:独身] 人:[名:ボビー、性別:男性、婚姻状況:独身] 人:[名前:ローラ、性別:女性、婚姻状況:既婚]