23種設計模式之過濾模式

来源:https://www.cnblogs.com/HYV587/archive/2020/06/16/13139512.html
-Advertisement-
Play Games

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

}

乾垃圾:
果殼
陶瓷
濕垃圾:
菜根菜葉
果皮
有害垃圾:
電池
水銀溫度計
燈泡
可回收垃圾:
廢紙塑料
金屬和布

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 幾天前一個小伙伴問我 Object.getOwnPropertyNames() 是乾什麼用的 平時還真沒有使用到這個方法,一時不知如何回答 從方法名稱來分析,應該是返回的是對象自身屬性名組成的數組 那和 Object.keys() 方法不就一樣了嗎 感覺事情並不這麼簡單,於是我仔細看了一下這幾種遍歷 ...
  • 在平時的開發過程中,父子 / 兄弟組件間的通信是肯定會遇到的啦,所以這裡總結了 6 種 Vue 組件的通信props / $e$emit / Vuex$attrs / $listeners $parent / $children 與 ref provide / inject 前言 如上圖所示,A/B ...
  • 只要接觸過前端,都會指導web前端的知識主要由三部分組成:分別為靜態html,樣式css,動態javascript(簡稱js)這三大部分組成。其三部分組成的一個體系的複雜程度不亞於其他一門技術的複雜程度。當然對於跟我一樣厲害的那些web前端來說那就是小菜一碟,但是很多人都只學了錶面,基礎部分,很多重 ...
  • 在日常開發中,項目中的菜單欄都是已經實現好了的。如果需要添加新的菜單,只需要在`路由配置`中新增一條路由,就可以實現菜單的添加。 相信大家和我一樣,有時候會躍躍欲試自己去實現一個菜單欄。那今天我就將自己實現的菜單欄的整個思路和代碼分享給大家。 ...
  • 1.let 和 const 命令 在es5時,只有兩種變數聲明,var 和function。在es6中新增了四種let和const,以及另外兩種聲明import和class。 我們先講解let和const,後續會補充import和class (1)let 我們先來看基本語法 { let a = 10 ...
  • 目錄: 1.擴展運算符2.Array.form()3.Array.of()4.數組實例的copyWithin()5.數組實例的find()和findIndex()6.數組實例的fill()7.數組實例的entries(),keys(),vlaues()8.數組實例的includes()9.數組的空位 ...
  • 也許你瞧不起以前的 css ,但是你不該再輕視眼下的 css 。近年來 css 的變數系統已逐步得到各大瀏覽器廠商支持,自定義選擇器等強勢襲來,嵌套系統/模塊系統也在路上…為了更好的掌握 css 這門語言,很有必要把之前零零散散的 css 知識回爐重造下。 css 作為一門語言而,也有其繼承原理,雖 ...
  • 將一些零散的知識點進行整理, 以便加深理解,方便查閱,也希望能幫到大家。 一、負載均衡演算法 1. 隨機 完全隨機 通過系統隨機函數,根據後端伺服器列表的大小值來隨機選擇其中一臺進行訪問。由概率統計理論可以得知,隨著調用量的增大,其實際效果越來越接近於平均分配流量到每一臺後端伺服器,也就是輪詢的效果。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...