策略模式(Strategy Pattern) —— 定義一系列的算法,把它們一個個封裝起來,而且使它們可互相替換。本模式使得算法的變化可獨立於使用它的客戶。ios
在存在如下狀況時可以使用Strategy模式:c++
須要使用一個算法的不一樣變體。(例如對稱加密算法,可以使用AES、RSA、DES等)算法
一個類定義了多種行爲,而且這些行爲在這個類的操做中以多個條件語句的形式出現。可將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。(缺點是增長了對象的數目)數據結構
算法使用客戶不該該知道的數據。可以使用策略模式以免暴露覆雜的、與算法相關的數據結構。ui
#include<iostream>
using namespace std;
// 策略抽象類
class Strategy {
public:
virtual void AlgrithmInterface()=0;
virtual ~Strategy(){}
protected:
Strategy(){}
};
// 策略A
class ConcreteStrategyA :public Strategy{
public:
ConcreteStrategyA(){}
~ConcreteStrategyA(){}
void AlgrithmInterface(){
cout<<"A strategy impl."<<endl;
}
};
// 策略B
class ConcreteStrategyB :public Strategy {
public:
ConcreteStrategyB(){}
~ConcreteStrategyB(){}
void AlgrithmInterface(){
cout<<"B strategy impl."<<endl;
}
};
class Context {
public:
Context(Strategy* s){
m_strategy = s;
}
~Context(){}
void DoAction(){
cout<<"Context DoAction:"<<endl;
m_strategy->AlgrithmInterface();
}
void change_strategy(Strategy* v){
m_strategy = v;
}
private:
Strategy* m_strategy;
};
int main(){
Strategy* sa = new ConcreteStrategyA();
Context* con = new Context(sa);
con->DoAction();
Strategy* sb = new ConcreteStrategyB();
con->change_strategy(sb);
con->DoAction();
delete sa;
delete sb;
delete con;
return 0
}
複製代碼
能夠看到策略模式很是簡單直接,其實就是將策略進行抽象,對不一樣的策略子類實現具體的方法,使用策略時,選擇對應策略的子類對象便可。加密