C 設計模式之策略模式

2022-10-04 04:06:09 字數 2445 閱讀 7067

前言

剛剛加班回來;哎,公司規定平時加班只有10塊錢的餐補;星期六和星期天加班,只給串休假;在國家規定的節假日按照3倍工資發放。那麼對於這麼多的計算加班費的方法,公司的oa系統是如何進行做的呢?這就要說到今天我這裡總結的策略設計模式了。

策略模式

在gof的《設計模式:可復用物件導向軟體的基礎》一書中對策略模式是這樣說的:定義一系列的演算法,把它們乙個個封裝起來,並且使它們可相互替換。該模式使得演算法可獨立於使用它的客戶而變化。

策略模式為了適應不同的需求,只把變化點封裝了,這個變化點就是實現不同需求的演算法,但是,使用者需要知道各種演算法的具體情況。就像上面的加班工資,不同的加班情況,有不同的演算法。我們不能在程式中將計算工資的演算法進行硬編碼,而是能自由的變化的。這就是策略模式。

uml類圖

strategy:定義所有支援的演算法的公共介面。context使用這個介面來呼叫某concretestrategy定義的演算法;

concretestrategy:實現strategy介面的具體演算法;

context:使用乙個concretestrategy物件來配置;維護乙個對stategy物件的引用,同時,可以定義乙個介面來讓stategy訪問它的資料。

使用場合

當存在以下情況時使用strategy模式:

1.許多相關的類僅僅是行為有異。「策略」提供了一種用多個行為中的乙個行為來配置乙個類的方法;

2.需要使用乙個演算法的不同變體;

3.演算法使用客戶不應該知道的資料。可使用策略模式以避免暴露複雜的、與演算法相關的資料結構;

4.乙個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的strategy類中以替代這些條件語句。(是不是和狀態模式有點一樣哦?)

**實現

首先實現最單純的策略模式,**如下:

複製** **如下:

#include

using namespace std;

// the abstract strategy

class strategy; 

class concretestrategya : public strategy}; 

class concretestrategyb : public strategy}; 

class concretestrategyc : public strategy}; 

class context

void contextinte***ce()

private:

strategy *pstrategy;}; 

int main()

在實際操作的過程中,我們會發現,在main函式中,也就是在客戶端使用策略模式時,會建立非常多的strategy,而這樣就莫名的增加了客戶端的壓力,讓客戶端的複雜度陡然增加了。那麼,我們就可以借鑑簡單工廠模式,使策略模式和簡單工廠模式相結合,從而減輕客戶端的壓力,**實現如下:

複製** **如下:

#include

using namespace std;

// define the strategy type

typedef enum strategytype

strategytype;

// the abstract strategy

class strategy; 

strategy::~strategy(){} 

class concretestrategya : public strategy

~concretestrategya(){}}; 

class concretestrategyb : public strategy

~concretestrategyb(){}}; 

class concretestrategyc : public strategy

~concretestrategyc(){}}; 

class context

}~context()

void co程式設計客棧ntextinte***ce()

private:

s程式設計客棧trategy *pstrategy;}; 

int main()

在上面這個**中,其實,我們可能看到的更多的是簡單工廠模式的應用,我們將策略模式將簡單工廠模式結合在了一起,讓客戶端使用起來更輕鬆。

總結策略模式和狀態模式,是大同小異的;狀態模式講究的是狀態的變化,和不同狀態下,執行的不同行為;而策略模式側重於同乙個動作,實現該行為的演算法的不同,不同的策略封裝了不同的演算法。策略模式適用於實現某一功能,而實現該功能的演算法是經常改變的情況。在實際工作中,遇到了實際的場景,可能會有更深的體會。比如,我們做某乙個系統,該系統可以適用於各種資料庫,我們都知道,連線某一種資料庫的方式是不一樣的,也可以說,連線資料庫的「演算法」都是不一樣的。這樣,我們就可以使用策略模式來實現不同的連線資料庫的策略,從而實現資料庫的動態變換。

本文標題: c++設計模式之策略模式

本文位址:

c 設計模式之策略模式

策略模式由多個封裝在乙個稱為context的驅動器類裡的相關演算法組成。客戶端程式可以從這些不同的演算法裡選擇乙個,或者在某些情況下,由context替你選擇乙個最好的演算法,策略模式的意圖是使這些演算法可交換,並提供一種方法來選擇最合適的演算法 策略模式跟工廠模式很像,都是交由客戶端來根據需求動態...

c 設計模式之策略模式

策略模式 它定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化不會影響到使用演算法的使用者。二者的相同點是,都是通過多型來實現子類的實現。簡單工廠模式是通過選項生成對應的子類,來進行對應的操作。而策略模式是將生成子類的操作和對子類的操作封裝在了一起,實現了更好的封裝。簡單而...

c 設計模式之策略模式

概念 通過定義一系列封裝的演算法,使得排程者可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。特點 1 根據不同的情況建立不同的物件。2 每個物件的方法名相同,但實現卻不同。結構 1 乙個抽象策略 2 多個繼承策略 c 持有乙個具體策略類的引用,供客戶端使用 includeusing ...