先看一下策略模式的UML類圖:
從類圖可以看出,策略模式基本和簡單原廠模式沒什麼區別,從我的理解他們兩個最大的區別就是:簡單原廠模式是實現對象的多樣性,而策略模式適合類中的成員以方法為主; 簡單原廠模式只能解決對象建立問題,對於經常變動的演算法應使用原則模式。
放代碼看看吧:
Cpp代碼
- //策略基類
- class COperation
- {
- public:
- int m_nFirst;
- int m_nSecond;
- virtual double GetResult()
- {
- double dResult=0;
- return dResult;
- }
- };
-
- //策略具體類—加法類
- class AddOperation : public COperation
- {
- public:
- AddOperation(int a,int b)
- {
- m_nFirst=a;
- m_nSecond=b;
- }
- virtual double GetResult()
- {
- return m_nFirst+m_nSecond;
- }
- };
-
- class Context
- {
- private:
- COperation* op;
- public:
- Context(COperation* temp)
- {
- op=temp;
- }
- double GetResult()
- {
- return op->GetResult();
- }
- };
-
- //用戶端
- int main()
- {
- int a,b;
- char c;
- cin>>a>>b;
- cout<<”請輸入運算子:;
- cin>>c;
- switch(c)
- {
- case ‘+’:
- Context *context=new Context(new AddOperation(a,b));
- cout<<context->GetResult()<<endl;
- break;
- default:
- break;
- }
- return 0;
- }
//策略基類class COperation{public:int m_nFirst;int m_nSecond;virtual double GetResult(){double dResult=0;return dResult;}};//策略具體類—加法類class AddOperation : public COperation{public:AddOperation(int a,int b){m_nFirst=a;m_nSecond=b;}virtual double GetResult(){return m_nFirst+m_nSecond;}};class Context{private:COperation* op;public: Context(COperation* temp){ op=temp;}double GetResult(){return op->GetResult();}};//用戶端int main(){ int a,b; char c; cin>>a>>b; cout<<”請輸入運算子:; cin>>c; switch(c) { case ‘+’: Context *context=new Context(new AddOperation(a,b)); cout<<context->GetResult()<<endl; break; default: break; } return 0;}
為了方便,我這裡只放了一個加法類,你可以自己繼承一個減法、乘法等,然後在主函數switch裡面添加相關的分類。我想到這裡,大家也看到了策略方法的缺點 :將對操作的判斷全部放在了用戶端,增加了客戶的任務。
大家知道,簡單原廠模式正好是把判斷操作都集中到工廠類裡,於是可以想到將兩個模式結合,就出現了下面的模式----策略與工廠結合模式,代碼在上面代碼的基礎上修改:
Cpp代碼
- class Context
- {
- private:
- COperation* op;
- public:
- Context(char cType)
- {
- switch (cType)
- {
- case '+':
- op=new AddOperation(3,8);
- break;
- default:
- op=new AddOperation();
- break;
- }
- }
- double GetResult()
- {
- return op->GetResult();
- }
- };
- //用戶端
- int main()
- {
- int a,b;
- cin>>a>>b;
- Context *test=new Context('+');
- cout<<test->GetResult()<<endl;
- return 0;
- }
class Context{private:COperation* op;public: Context(char cType){ switch (cType) {case '+':op=new AddOperation(3,8);break;default:op=new AddOperation();break; }}double GetResult(){return op->GetResult();}};//用戶端int main(){int a,b;cin>>a>>b;Context *test=new Context('+');cout<<test->GetResult()<<endl;return 0;}