設計模式(七)策略模式 Strategy

2021-07-09 02:11:52 字數 2073 閱讀 8406

1.介紹/作用:

定義一系列的演算法,把它們乙個個封裝起來, 並且使它們可相互替換。本模式使得演算法可獨

立於使用它的客戶而變化。

2.應用場景:

每個人都要「交個人所得稅」,但是「在美國交個人所得稅」和「在中國交個人所得稅」就有不同的算稅方法。 而策略模式就是對演算法進行包裝,是把使用演算法的責任和演算法本身分割開來,委派給不同的物件管理。策略模式通常把乙個系列的演算法包裝到一系列的策略類裡面,作為乙個抽象策略類的子類。用一句話來說,就是:「準備一組演算法,並將每乙個演算法封裝起來,使得它們可以互換」。

3.uml類圖

4.實現**

#ifndef _strategy_h_

#define _strategy_h_

#include using namespace std;

//策略(演算法...)

class strategy

; virtual ~strategy(){};

virtual void algorithminte***ce()=0;

protected:

};//策略使用類

class context

; virtual ~context(){};

void contextinte***ce()

private:

strategy* m_pstrategy;

};//各類演算法

class concretestrategya :public strategy

; virtual ~concretestrategya(){};

virtual void algorithminte***ce()

private:

};class concretestrategyb :public strategy

; virtual ~concretestrategyb(){};

virtual void algorithminte***ce()

private:

};#endif

呼叫**片段:

concretestrategya* pconcretestrategya = new concretestrategya();

context* pcontext = new context(pconcretestrategya);

pcontext->contextinte***ce();

concretestrategyb* pconcretestrategyb = new concretestrategyb();

context* pcontext2 = new context(pconcretestrategyb);

pcontext2->contextinte***ce();

輸出:

concretestrategya algorithminte***ce...

concretestrategyb algorithminte***ce...

請按任意鍵繼續. . .

5.擴充套件/補充

和其他設計模式的區別:

1,與狀態模式

在解決的問題上,狀態模式是解決內在狀態的改變,而策略模式是解決內部演算法的改變。在解決的方法上,狀態模式是自我控制狀態的改變,而策略模式是由外部制定使用使用啥策略。

2,簡單工廠模式

簡單工廠模式是建立型模式,關注物件的建立。策略模式是行為型模式,關注行為的封裝。簡單工廠模式是根據不同的條件返回乙個適合的類給你使用,然後呼叫者使用工廠類返回的類去完成相應的操作。而策略模式是必須首先建立乙個想使用的類例項,然後例項被當作引數傳遞進去,既而通過該例項去呼叫不用的演算法。在簡單工廠模式中實現了通過條件選取乙個類去例項化物件,策略模式則將選取相應物件的工作交給模式的使用者,它本身不去做選取工作。

設計模式 策略設計模式

策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...

設計模式 策略模式

策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些方法完成的都是相同的工作,只是實現不同,他們可以用相同的方式呼叫所有的演算法,減少了演算法類和使用演算法類之間的耦合.優點 策略模式的strategy類層次為context定義了一系列可供重用的演算法和行為,繼承有助於吸取這些演算法中的公共...

設計模式 策略模式

定義了演算法家族,分別封裝起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的客戶端 定義抽象類 分別實現抽象類,不同的物件 然後用乙個類初始化,並傳入具體的策略物件 根據具體的策略物件,呼叫其演算法的方法 客戶端 是由於例項化不同的策略,所以最終在呼叫 類時,所獲得的結果時不...