二 策略模式 C

2021-10-05 06:43:20 字數 2175 閱讀 7388

策略模式(源自網上)

在策略模式(strategy pattern)中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。

在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。

個人理解

假如你要做乙個件事情,而做這件事會有很多種方法,而每一種方法只是其中的一些行為不一樣,那我們可以設計乙個方法抽象基類,然後每一種方法繼承於基類,並實現自己的行為,之後策略模式會根據你選擇的不同方法呼叫該方法的行為去實現辦成這件事。

例如:我想計算超市某些商品的真實****,商品真實****可能會存在這三種情況(更多的情況就不過多說明):1.原價**;2.打折**;3.滿減**;我們可以把每一種**方式設計成乙個類,他們共同繼承於策略抽象類,然後在策略裡面通過客戶端選擇的不同類例項而呼叫該類的計算方法計算出真實的****。

**結構圖

**實現

a.**優惠抽象基類

class

cashsuper

;

b.正常****類

class

cashnormal

:public cashsuper

};

c.打折優惠**類

class

cashrebate

:public cashsuper

double

acceptcash

(double money)

private

:double m_dmoneyrebate;

//折扣率

};

d.滿減優惠**類

class

cashreturn

:public cashsuper

double

acceptcash

(double money)

else

}private

:double m_dmoneycondition;

double m_dmoneyreturn;

};

e.策略類

class

cashcontext

double

getresult

(double money)

private

: cashsuper * m_pcashsuper;

};

f.客戶端實現

int

main()

cout <<

"需要支付的價錢:"

<< pcashcontext-

>

getresult

(dmoney)

<< endl;

system

("pause");

return0;

}

小結客戶端通過選擇不同的優惠方法類生成對應例項,然後傳遞給策略類並在策略類中通過多型呼叫相應優惠方法類的成員函式acceptcash,計算所得實際****。主要適用於:乙個系統有許多許多類,而區分它們的只是他們直接的行為。

策略模式和工廠模式的結合

上面的例子我們是把不同的方法類的選擇交給了客戶端,如果我們把它移到策略中,就可以很大程度減輕客戶端的壓力。

這就是策略模式和工廠模式的結合,我們需要修改策略類和客戶端斷碼如下:

策略類**

class

cashcontext

}double

getresult

(double money)

private

: cashsuper * m_pcashsuper;

};

客戶端**

int

main()

設計模式C 實現二 策略模式

策略模式 strategy 定義演算法家族,分別封裝起來,讓這些演算法直接可以相互替換,我們可以自由新增或者修改演算法而不會影響客戶.優點 簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。如果我們在客戶端為了判斷使用哪個演算法而使用switch語句來分析,我們可以使用策略模式...

(二)策略模式

定義演算法家族,分別封裝起來,讓它們之間可以互相替換,讓演算法變化,不會影響到使用者 good 適合類中的成員以方法為主,演算法經常變動 簡化了單元測試 因為每個演算法都有自己的類,可以通過自己的介面單獨測試。策略模式和簡單工廠基本相同,但簡單工廠模式只能解決物件建立問題,對於經常變動的演算法應使用...

二 策略模式

在策略模式 strategy pattern 中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。主要解決了 在有多種演算法相似...