概念
策略模式是一種行為設計摸是,它的核心思想是將一些列的算法封裝成獨立的對象,并使它們可以相互替換,通過上下文進行調用。
策略模式通過算法抽象為獨立的策略類,客戶端可以根據自身需求選擇不同的策略類來完成任務、這種方式使得算法的變化不會影響客戶端代碼。
適用場景
1、當使用對象使用一系列不同的算法,并在運行的時候需要進行動態切換,可以使用策略模式。
2、當有許多的僅在執行的時候一些行為不同,但是這些行為卻有些類似的時候就可以使用策略模式。
3、隔離算法和業務邏輯,如果算法的邏輯在上下文中不是很重要,那么就可以使用策略模式將算法封裝,實現算法和業務邏輯的隔離。
4、當使用了一系列同一算法的不同變體的時候,需要復雜的條件判斷來執行對應的算法的時候,可以使用策略模式。減少業務邏輯的復雜度。
創建方式
1、策略模式需要創建立兩個接口,一個是算法接口類,一個是上下文接口。
2、創建算法接口類,需要定義一個算法函數。
3、創建一個上下文接口,需要實現一個算法的引用對象,和一個是設置算法對象的函數,算法執行函數。
4、實現具體的事算法類,繼承算法接口類,實現具體的算法實現。
5、實現具體的上下類,繼承上下接口。實現接口中的函數。在實現定調用的函數的時候通過算法對象的引用調用算法函數。
6、在客戶端使用的時候,先創建算法對象,之后創建上下文對象,在創建上下文對象的時候可以通過構造函數或者設置算法對象的函數將算法對象設置給上下文對象。之后調用上下文函數即可。
類關系圖
示例代碼
#include "CeLueMoShi.h"
int main()
{std::cout << "歡迎東哥來到設計模式的世界!\n";//創建策略類對象AlgorithmBase* add = new AddAlgorithm();AlgorithmBase* sub = new SubAlgorithm();AlgorithmBase* mul = new MulAlgorithm();//創建上下文類CeContext context;context.setAlgorith(add);int ret = context.callAlgorithm(5, 5);cout << "add : ret = " << ret << endl;context.setAlgorith(sub);ret = context.callAlgorithm(5, 5);cout << "sub : ret = " << ret << endl;context.setAlgorith(mul);ret = context.callAlgorithm(5, 5);cout << "mul : ret = " << ret << endl;
}
#pragma once//算法接口類
class AlgorithmBase
{
public:AlgorithmBase() {}~AlgorithmBase() {}virtual int algorithm(int a, int b) { return 0; }
};//具體算法類 +
class AddAlgorithm : public AlgorithmBase {
public:AddAlgorithm() {}~AddAlgorithm() {}int algorithm(int a, int b) {return a + b;}};//具體算法類 -
class SubAlgorithm : public AlgorithmBase {
public:SubAlgorithm() {}~SubAlgorithm() {}int algorithm(int a, int b) {return a - b;}};//具體算法類 *
class MulAlgorithm : public AlgorithmBase {
public:MulAlgorithm() {}~MulAlgorithm() {}int algorithm(int a, int b) {return a * b;}};//上下文類,此處省略接口類
class CeContext {
public:CeContext() {}~CeContext() {}void setAlgorith(AlgorithmBase* alg) {m_alg = alg;}int callAlgorithm(int a,int b) {int ret = 0;if (m_alg) {ret = m_alg->algorithm(a, b);}return ret;}
private:AlgorithmBase* m_alg = nullptr;
};
歡迎東哥來到設計模式的世界!
add : ret = 10
sub : ret = 0
mul : ret = 25