23種設計模式之過濾模式

/**
 * 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());
        }
        
    }

}

幹垃圾:
果殼
陶瓷
溼垃圾:
菜根菜葉
果皮
有害垃圾:
電池
水銀溫度計
燈泡
可回收垃圾:
廢紙塑料
金屬和布
相關文章
相關標籤/搜索