概念
策略模式:定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到用算法的客戶。
注意:與簡單工廠模式相比,使用上只需要知道 Context 類即可
應用場景
- 算法會時常變動;
- 用幾個類封裝了這些算法且有共同的父類;
一般步驟
- 抽象一個算法類
class Strategy { public: virtual void Algorithm()=0; };
- 寫具體的子類
class ConcreateStrategyA : public Strategy { public: void Algorithm() { printf("ConcreateStrategyA \n"); } }; class ConcreateStrategyB : public Strategy { public: void Algorithm() { printf("ConcreateStrategyB \n"); } }; class ConcreateStrategyC : public Strategy { public: void Algorithm() { printf("ConcreateStrategyC \n"); } };
- 創建一個類,根據不同條件調用不同的策略
class Context { public: Context(char algorithm) { this->algorithm = algorithm; switch (algorithm) { case 'A': this->strategy = new ConcreateStrategyA(); break; case 'B': this->strategy = new ConcreateStrategyB(); break; case 'C': this->strategy = new ConcreateStrategyC(); break; default: this->strategy = NULL; break; } } ~Context() { printf("delete strategy%c\n",algorithm); delete strategy; } void ContextInterface() { strategy->Algorithm(); } private: Strategy *strategy; char algorithm; };
具體實例
#include <cstdio>
class Strategy // 抽象類-策略類
{
public:
virtual void Algorithm()=0;
};
class ConcreateStrategyA : public Strategy // 策略A
{
public:
void Algorithm()
{
printf("ConcreateStrategyA \n");
}
};
class ConcreateStrategyB : public Strategy // 策略B
{
public:
void Algorithm()
{
printf("ConcreateStrategyB \n");
}
};
class ConcreateStrategyC : public Strategy // 策略C
{
public:
void Algorithm()
{
printf("ConcreateStrategyC \n");
}
};
#if 0
class Context
{
public:
Context(Strategy *strategy)
{
this->strategy = strategy;
}
~Context()
{
delete strategy;
}
void ContextInterface()
{
strategy->Algorithm();
}
private:
Strategy *strategy;
};
int main()
{
Context *context = NULL;
context = new Context(new ConcreateStrategyA());
context->ContextInterface();
context = new Context(new ConcreateStrategyB());
context->ContextInterface();
context = new Context(new ConcreateStrategyC());
context->ContextInterface();
return 0;
}
#else
class Context // 使用策略的類
{
public:
Context(char algorithm)
{
this->algorithm = algorithm;
switch (algorithm)
{
case 'A':
this->strategy = new ConcreateStrategyA();
break;
case 'B':
this->strategy = new ConcreateStrategyB();
break;
case 'C':
this->strategy = new ConcreateStrategyC();
break;
default:
this->strategy = NULL;
break;
}
}
~Context()
{
printf("delete strategy%c\n",algorithm);
delete strategy;
}
void ContextInterface()
{
strategy->Algorithm();
}
private:
Strategy *strategy;
char algorithm;
};
int main()
{
Context *context = NULL;
context = new Context('A');
context->ContextInterface();
delete context;
context = new Context('B');
context->ContextInterface();
delete context;
context = new Context('C');
context->ContextInterface();
delete context;
return 0;
}
#endif
總結
策略模式是一種定義了一系列算法的方法,它可以以相同的方式調用所有的算法,減少各種算法類與使用算法類之間的耦合。 --《大話設計模式》
策略模式的 Strategy類層次爲 Context 類定義了一系列可供重用的算法和行爲。繼承有助於析取出這些算法中的公共功能。
參考資料:
《大話設計模式》