• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • C++ 設計模式:過濾器模式

    標簽: C++ VC

    過濾器模式

    過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。這種類型的設計模式屬于結構型模式,它結合多個標準來獲得單一標準。

     

    實現

    我們將創建一個 Person 對象、Criteria 接口和實現了該接口的實體類,來過濾 Person 對象的列表。CriteriaPatternDemo,我們的演示類使用 Criteria 對象,基于各種標準和它們的結合來過濾 Person 對象的列表。

    過濾器模式的 UML 圖

     示例代碼:

    person.h

    #pragma once
    #include <string>
    using namespace std;
    
    class Person
    {
    private:
    	string name;
    	string gender;
    	string mantalStatus;
    public:
    	Person(string name, string gender, string mantalStatus);
    	string getName();
    	string getGender();
    	string getMantalStatus();
    };

    person.cpp

    #include "Person.h"
    
    Person::Person(string name, string gender, string mantalStatus)
    {
    	this->name = name;
    	this->gender = gender;
    	this->mantalStatus = mantalStatus;
    }
    
    string Person::getName()
    {
    	return name;
    }
    
    string Person::getGender()
    {
    	return gender;
    }
    
    string Person::getMantalStatus()
    {
    	return mantalStatus;
    }

    Criteria.h

    #pragma once
    #include "Person.h"
    #include <list>
    using namespace std;
    
    class Criteria
    {
    public:
    	virtual list<Person*> meetCriteria(list<Person*> persons) = 0;
    };
    
    
    class CriteriaFemale :public Criteria
    {
    public:
    	virtual list<Person*> meetCriteria(list<Person*> persons);
    };
    
    class CriteriaMale :public Criteria
    {
    public:
    	virtual list<Person*> meetCriteria(list<Person*> persons);
    };
    
    class CriteriaSingle :public Criteria
    {
    public:
    	virtual list<Person*> meetCriteria(list<Person*> persons);
    };
    
    class AndCriteria :public Criteria
    {
    private:
    	Criteria *pCriteria;
    	Criteria *pOtherCriteria;
    public:
    	AndCriteria(Criteria *pCriteria, Criteria *pOtherCriteria);
    	virtual list<Person*> meetCriteria(list<Person*> persons);
    };
    
    class OrCriteria :public Criteria 
    {
    private:
    	Criteria *pCriteria;
    	Criteria *pOtherCriteria;
    public:
    	OrCriteria(Criteria *pCriteria, Criteria *pOtherCriteria);
    	virtual list<Person*> meetCriteria(list<Person*> persons);
    };

    criterial.cpp

    #include "Criteria.h"
    
    list<Person*> CriteriaFemale::meetCriteria(list<Person*> persons)
    {
    	list<Person*> listPerson;
    	for (auto it : persons)
    	{
    		if (it->getGender() == "Female")
    		{
    			listPerson.push_back(it);
    		}
    	}
    	return listPerson;
    }
    
    list<Person*> CriteriaMale::meetCriteria(list<Person*> persons)
    {
    	list<Person*> listPerson;
    	for (auto it : persons)
    	{
    		if (it->getGender() == "Male")
    		{
    			listPerson.push_back(it);
    		}
    	}
    	return listPerson;
    }
    
    list<Person*> CriteriaSingle::meetCriteria(list<Person*> persons)
    {
    	list<Person*> listPerson;
    	for (auto it : persons)
    	{
    		if (it->getMantalStatus() == "Single")
    		{
    			listPerson.push_back(it);
    		}
    	}
    	return listPerson;
    }
    
    AndCriteria::AndCriteria(Criteria *pCriteria, Criteria *pOtherCriteria)
    {
    	this->pCriteria = pCriteria;
    	this->pOtherCriteria = pOtherCriteria;
    }
    
    
    list<Person*> AndCriteria::meetCriteria(list<Person*> persons)
    {
    	list<Person*> listPerson1 = pCriteria->meetCriteria(persons);
    	return pOtherCriteria->meetCriteria(listPerson1);
    }
    
    OrCriteria::OrCriteria(Criteria *pCriteria, Criteria *pOtherCriteria)
    {
    	this->pCriteria = pCriteria;
    	this->pOtherCriteria = pOtherCriteria;
    }
    
    
    list<Person*> OrCriteria::meetCriteria(list<Person*> persons)
    {
    	list<Person*> listPerson1 = pCriteria->meetCriteria(persons);
    	list<Person*> listPerson2 = pOtherCriteria->meetCriteria(persons);
    	for (auto it : listPerson2)
    	{
    		bool bFind = false;
    		for (auto it2 : listPerson1)
    		{
    			if (it2 == it)
    			{
    				bFind = true;
    				break;
    			}
    		}
    		if (!bFind)
    		{
    			listPerson1.push_back(it);
    		}
    	}
    	return listPerson1;
    }

    main.cpp

    #include "Person.h"
    #include "Criteria.h"
    #include <stdio.h>
    
    void printPersons(list<Person*> persons)
    {
    	printf("\n");
    	for (auto it : persons)
    	{
    		printf("Person: [Name: %s, Gender: %s, Matal Status:%s]\n", it->getName().c_str(), it->getGender().c_str(), it->getMantalStatus().c_str());
    	}
    }
    
    void main()
    {
    	list<Person*> persons;
    	persons.push_back(new Person("Robert", "Male", "Single"));
    	persons.push_back(new Person("John", "Male", "Married"));
    	persons.push_back(new Person("Laura", "Female", "Married"));
    	persons.push_back(new Person("Diana", "Female", "Single"));
    	persons.push_back(new Person("Mike", "Male", "Single"));
    	persons.push_back(new Person("Bobby", "Male", "Married"));
    	Criteria *pMale = new CriteriaMale();
    	Criteria *pFeMale = new CriteriaFemale();
    	Criteria *pSingle = new CriteriaSingle();
    	Criteria *pSingleMale = new AndCriteria(pSingle, pMale);
    	Criteria *pSingleOrFemale = new OrCriteria(pSingle, pFeMale);
    
    	printf("Males: ");
    	printPersons(pMale->meetCriteria(persons));
    
    	printf("\nFeMales: ");
    	printPersons(pFeMale->meetCriteria(persons));
    
    	printf("\nSingle Males: ");
    	printPersons(pSingleMale->meetCriteria(persons));
    
    	printf("\nSingle or FeMales: ");
    	printPersons(pSingleOrFemale->meetCriteria(persons));
    
    	getchar();
    }

    運行結果:

    Males:
    Person: [Name: Robert, Gender: Male, Matal Status:Single]
    Person: [Name: John, Gender: Male, Matal Status:Married]
    Person: [Name: Mike, Gender: Male, Matal Status:Single]
    Person: [Name: Bobby, Gender: Male, Matal Status:Married]
    
    FeMales:
    Person: [Name: Laura, Gender: Female, Matal Status:Married]
    Person: [Name: Diana, Gender: Female, Matal Status:Single]
    
    Single Males:
    Person: [Name: Robert, Gender: Male, Matal Status:Single]
    Person: [Name: Mike, Gender: Male, Matal Status:Single]
    
    Single or FeMales:
    Person: [Name: Robert, Gender: Male, Matal Status:Single]
    Person: [Name: Diana, Gender: Female, Matal Status:Single]
    Person: [Name: Mike, Gender: Male, Matal Status:Single]
    Person: [Name: Laura, Gender: Female, Matal Status:Married]

     

    版權聲明:本文為qq_24127015原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_24127015/article/details/105408725

    智能推薦

    過濾器模式

    過濾器模式 內容參考 w3c School   分類:結構性設計模式 應用:通過不同標準篩選不同的對象,分類處理 目錄 過濾器模式 UML類圖 創建用戶實體類 Person 創建標準接口 創建 男/女性、單身標準 創建 標準的交集以及并集 測試執行 UML類圖 這個應用將用戶組通過過濾器進行分類,分為 男性、女性、單身人士、單身男士、單身或者女士 組別。 Criteria 為指...

    數組刪除其中某個對象的方法

    數組刪除其中的對象或元素,在前端是比較常見的需求。 我現在比較常用的方法如下: 這種方法只適合刪除具有唯一標識的對象。 有沒有想要脫單的小伙伴,加入我們的脫單星球,認識更多優秀的小哥哥小姐姐 特此聲明,星球是免費的,但是創建星球的時候說是必須輸入金額,所以只能先私聊,我再加你免費加入!...

    圖床搭建以及圖床工具的使用

    為什么要用圖床和圖床工具? 比較下面三種md中的圖片url地址(均免費),你會使用哪一種? 選1?由于是本地路徑,文檔分享后給其他人打開后很可能顯示圖片加載失敗。 選2?雖然分享后可以顯示圖片,但能保證加載速度? 選3?我肯定選這種,即兼容2的瀏覽器訪問,又能保證訪問速度。 這樣就可以回答上面的問題了!保證瀏覽器訪問要用圖床,保證加載速度要用圖床工具,又不花錢想想就開心。 除此之外本篇博客還會講解...

    并發編程理論篇

    一、必備知識回顧 計算機又叫電腦,即通電的大腦,發明計算機是為了讓他通電之后能夠像人一樣去工作,并且它比人的工作效率更高,因為可以24小時不間斷 計算機五大組成部分 控制器 運算器 存儲器 輸入設備 輸出設備 計算機的核心真正干活的是CPU(控制器+運算器=中央處理器) 程序要想被計算機運行,它的代碼必須要先由硬盤讀到內存,之后cpu取指再執行 并發 看起來像同時運行的就可以稱之為并發 并行 真正...

    Java LinkedHashMap

    Java LinkedHashMap 前言 Map是我們在實際使用過程中常用的集合,HashMap在Java的實際開發中出鏡率很高,它通過hash算法實現了高效的非線程安全的集合,它有一個缺點就是,用戶插入集合的數據時無序,在我們需要一些有序的map的時候,我們就需要引入另外一個集合:LinkedHashMap。 LinkedHashMap是一個有序的非線程安全的集合,它是HashMap的子類,基...

    猜你喜歡

    Spark Streaming處理文件(本地文件以及hdfs上面的文件)

    標題介紹文件流之前先介紹一下Dstream 下面是來自官網一段的說明,Discretized Streams或DStream是Spark Streaming提供的基本抽象。它表示連續的數據流,可以是從源接收的輸入數據流,也可以是通過轉換輸入流生成的已處理數據流。在內部,DStream由一系列連續的RDD表示,這是Spark對不可變的分布式數據集的抽象(有關更多詳細信息,請參見Spark編程指南)。...

    《痞子衡嵌入式半月刊》 第 8 期

    痞子衡嵌入式半月刊: 第 8 期 這里分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農歷年分二十四節氣,希望在每個交節之日準時發布一期。 本期刊是開源項目(GitHub: JayHeng/pzh-mcu-bi-weekly),歡迎提交 issue,投稿或推薦你知道的嵌入式那些事兒。 上期回顧 :《痞子衡嵌入式半月刊: 第 7 期》 嘮兩句 今天是小滿,小滿節氣意味著進入了大幅降水的雨季。痞子...

    (C++)二叉樹的線索化 / 線索二叉樹

    好久不見,朋友們!雖然我知道沒人看我的博客,但我還是想叨逼叨一下。啊,好久沒編程了(其實也就一周沒編),但你們知道,程序員一天不編程那能叫程序員么???雖然我不是程序員哈哈哈哈哈,但還是要有基本素養嘛。 繼續寫二叉樹,給自己立一個flag,就是這幾天要寫完之前沒做完的幾道題,和二叉樹紅黑樹各種樹之類的~~雖然有這個flag,但我還是很實誠地遵從自己的內心,買了一張明天的電影票,等我回來告訴你們好不...

    Linux內存管理:分頁機制

    《Linux內存管理:內存描述之內存節點node》 《Linux內存管理:內存描述之內存區域zone》 《Linux內存管理:內存描述之內存頁面page》 《Linux內存管理:內存描述之高端內存》 《Linux內存管理:分頁機制》 《內存管理:Linux Memory Management:MMU、段、分頁、PAE、Cache、TLB》 目錄 1 分頁機制 1.1 為什么使用多級頁表來完成映射 ...

    Logtail 混合模式:使用插件處理文件日志

    作為一個服務百萬機器的日志采集 agent,Logtail 目前已經提供了包括日志切分、日志解析(完整正則、JSON、分隔符)、日志過濾在內的常見處理功能,能夠應對絕大多數場景的處理需求。但有些時候,由于應用的歷史原因或是本身業務日志的復雜性,單一功能可能無法滿足所采集日志的處理需求,比如: 日志可能不再是單一格式,有可能同時由 JSON 或者分隔符日志組成。 日志格式可能也不固定,不同的業務邏輯...

    精品国产乱码久久久久久蜜桃不卡