策略模式C++實現

來源:互聯網
上載者:User

先看一下策略模式的UML類圖:

 

從類圖可以看出,策略模式基本和簡單原廠模式沒什麼區別,從我的理解他們兩個最大的區別就是:簡單原廠模式是實現對象的多樣性,而策略模式適合類中的成員以方法為主; 簡單原廠模式只能解決對象建立問題,對於經常變動的演算法應使用原則模式。

 

放代碼看看吧:

Cpp代碼
  1. //策略基類   
  2. class COperation   
  3. {   
  4. public:   
  5.     int m_nFirst;   
  6.     int m_nSecond;   
  7.     virtual double GetResult()   
  8.     {   
  9.         double dResult=0;   
  10.         return dResult;   
  11.     }   
  12. };   
  13.   
  14. //策略具體類—加法類   
  15. class AddOperation : public COperation   
  16. {   
  17. public:   
  18.     AddOperation(int a,int b)   
  19.     {   
  20.         m_nFirst=a;   
  21.         m_nSecond=b;   
  22.     }   
  23.     virtual double GetResult()   
  24.     {   
  25.         return m_nFirst+m_nSecond;   
  26.     }   
  27. };   
  28.   
  29. class Context   
  30. {   
  31. private:   
  32.     COperation* op;   
  33. public:   
  34.         Context(COperation* temp)   
  35.     {   
  36.         op=temp;   
  37.     }   
  38.     double GetResult()   
  39.     {   
  40.         return op->GetResult();   
  41.     }   
  42. };   
  43.   
  44. //用戶端   
  45. int main()   
  46. {   
  47.     int a,b;   
  48.     char c;   
  49.     cin>>a>>b;   
  50.   cout<<”請輸入運算子:;   
  51.     cin>>c;   
  52.     switch(c)   
  53.     {   
  54.     case ‘+’:   
  55.         Context *context=new Context(new AddOperation(a,b));   
  56.         cout<<context->GetResult()<<endl;   
  57.             break;   
  58.    default:   
  59.             break;   
  60.      }   
  61.      return 0;   
  62. }  
//策略基類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代碼
  1. class Context   
  2. {   
  3. private:   
  4.     COperation* op;   
  5. public:   
  6.     Context(char cType)   
  7.     {   
  8.             switch (cType)   
  9.             {   
  10.         case '+':   
  11.             op=new AddOperation(3,8);   
  12.             break;   
  13.         default:   
  14.             op=new AddOperation();   
  15.             break;   
  16.              }   
  17.     }   
  18.     double GetResult()   
  19.     {   
  20.         return op->GetResult();   
  21.     }   
  22. };   
  23. //用戶端   
  24. int main()   
  25. {   
  26.     int a,b;   
  27.     cin>>a>>b;   
  28.     Context *test=new Context('+');   
  29.     cout<<test->GetResult()<<endl;   
  30.     return 0;   
  31. }  
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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.