/** * 1.模式定義: * 過濾器(Filter Pattern)又稱為標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組對象, * 通過預算邏輯以解耦的方式將他們聯繫起來。這種類型的設計模式屬於結構模型,說白了,就是按條件篩選一組對象出來。 ...
/** * 1.模式定義: * 過濾器(Filter Pattern)又稱為標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組對象, * 通過預算邏輯以解耦的方式將他們聯繫起來。這種類型的設計模式屬於結構模型,說白了,就是按條件篩選一組對象出來。 * 目的:使用不同標準來過濾一組對象 * 實現:制定不同的規則來實現過濾,然後對過濾結果進行分組。 * 2.組成角色: * 1)抽象過濾器角色(AbstractFilter):負責定義過濾器的實現介面,具體的實現還要具體過濾器角色去參與,客戶端可以調用抽象過濾器角色中定義好 * 的方法,將 客戶端的所有請求委派到具體的實現類去,從而讓實現類去處理。 * 2)ConcreteFilter(具體過濾角色):該角色負責具體篩選規則的邏輯實現,最後再返回一個過濾後的數據集合,標準的過濾器只對數據做過濾,當然也 * 可以對集合中的數據做某項處理,再將處理後的集合返回。 * 3)Subject(被過濾的主體角色):一個軟體系統中可以有一個或多個目標角色,在具體過濾器角色中對指定的目標進行處理。 * 3.過濾器延伸: * 過濾器鏈:攜帶多個過濾器,並且可以以自定義順序執行他們。 * 過濾器管理角色:負責管理過濾器和過濾器鏈。 * 4.應用場景: * 垃圾桶分類 * 5.總結: * 1)可插拔:過濾器的設計概念要求其實支持可插拔設計的。 * 2)有序性:過濾器是被設計為一組組的過濾裝置,要實現數據過濾,就必須有序性要求. * 3)過濾器的獨立性:每種過濾器必須是獨立的實體,其狀態不受其它過濾器的影響,每個過濾器都有自己獨立的數據輸入輸出介面,只要各個過濾器之間 * 傳送的數據遵守共同的規約就可以相連接。 */ /* * 垃圾類,被過濾的主題角色 */ public class Rubbish { private String name; //垃圾名稱 private boolean isHarm; //是否有害垃圾 private boolean isRecycled; //是否可回收 private boolean isDry; //是否乾垃圾 private boolean isWet; //是否濕垃圾 public Rubbish(String name, boolean isHarm, boolean isRecycled, boolean isDry, boolean isWet) { this.name = name; this.isHarm = isHarm; this.isRecycled = isRecycled; this.isDry = isDry; this.isWet = isWet; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isHarm() { return isHarm; } public void setHarm(boolean isHarm) { this.isHarm = isHarm; } public boolean isRecycled() { return isRecycled; } public void setRecycled(boolean isRecycled) { this.isRecycled = isRecycled; } public boolean isDry() { return isDry; } public void setDry(boolean isDry) { this.isDry = isDry; } public boolean isWet() { return isWet; } public void setWet(boolean isWet) { this.isWet = isWet; } } /* * 過濾標準的介面,即抽象過濾角色 */ public interface Criteria { //定義過濾的標準 List<Rubbish> rubbishFilter(List<Rubbish> rubbishs); } /* * 實現Criteria介面的實體類 */ //乾垃圾 public class DryRubbishCriteria implements Criteria { @Override public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) { List<Rubbish> rubbishList=new ArrayList<Rubbish>(); for(Rubbish rubbish:rubbishs) { //這裡只過濾出所有乾垃圾 if (rubbish.isDry()) { rubbishList.add(rubbish); } } return rubbishList; } } //有害垃圾 public class HarmfulRubbishCriteria implements Criteria { @Override public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) { List<Rubbish> rubbishList=new ArrayList<Rubbish>(); for(Rubbish rubbish:rubbishs) { //這裡只過濾出所有乾垃圾 if (rubbish.isHarm()) { rubbishList.add(rubbish); } } return rubbishList; } } //可回收垃圾 public class RecycledRubbishCriteria implements Criteria{ @Override public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) { List<Rubbish> rubbishList=new ArrayList<Rubbish>(); for(Rubbish rubbish:rubbishs) { //這裡只過濾出所有乾垃圾 if (rubbish.isRecycled()) { rubbishList.add(rubbish); } } return rubbishList; } } //濕垃圾 public class WetRubbishCriteria implements Criteria{ @Override public List<Rubbish> rubbishFilter(List<Rubbish> rubbishs) { List<Rubbish> rubbishList=new ArrayList<Rubbish>(); for(Rubbish rubbish:rubbishs) { //這裡只過濾出所有乾垃圾 if (rubbish.isWet()) { rubbishList.add(rubbish); } } return rubbishList; } }
測試結果如下:
//使用不同的標準(Criteria)來過濾Rubbish對象的列表 public class Main { public static void main(String[] args) { //原始數據集合 List<Rubbish> rubbishList = new ArrayList<Rubbish>(); rubbishList.add(new Rubbish("果殼", false, false, true, false)); rubbishList.add(new Rubbish("陶瓷", false, false, true, false)); rubbishList.add(new Rubbish("菜根菜葉", false, false, false, true)); rubbishList.add(new Rubbish("果皮", false, false, false, true)); rubbishList.add(new Rubbish("電池", true, false, false, false)); rubbishList.add(new Rubbish("水銀溫度計", true, false, false, false)); rubbishList.add(new Rubbish("燈泡", true, false, false, false)); rubbishList.add(new Rubbish("廢紙塑料", false, true,false, false)); rubbishList.add(new Rubbish("金屬和布料", false, true, false, false)); //四種不同的過濾標準 Criteria dryRubbishCriteria=new DryRubbishCriteria(); Criteria wetRubbishCriteria=new WetRubbishCriteria(); Criteria harRubbishCriteria=new HarmfulRubbishCriteria(); Criteria recycledRubbishCriteria=new RecycledRubbishCriteria(); System.out.println("乾垃圾:"); printRubbishes(dryRubbishCriteria.rubbishFilter(rubbishList)); System.out.println("濕垃圾:"); printRubbishes(wetRubbishCriteria.rubbishFilter(rubbishList)); System.out.println("有害垃圾:"); printRubbishes(harRubbishCriteria.rubbishFilter(rubbishList)); System.out.println("可回收垃圾:"); printRubbishes(recycledRubbishCriteria.rubbishFilter(rubbishList)); } private static void printRubbishes(List<Rubbish> rubbishs) { for(Rubbish rubbish:rubbishs) { System.out.println(rubbish.getName()); } } } 乾垃圾: 果殼 陶瓷 濕垃圾: 菜根菜葉 果皮 有害垃圾: 電池 水銀溫度計 燈泡 可回收垃圾: 廢紙塑料 金屬和布