/** * 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()); } } } 干垃圾: 果殼 陶瓷 濕垃圾: 菜根菜葉 果皮 有害垃圾: 電池 水銀溫度計 燈泡 可回收垃圾: 廢紙塑料 金屬和布
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6013.html
標籤:設計模式
上一篇:【設計模式】如何用組合替代繼承
下一篇:策略模式
