C語言和設計模式(之模板模式) 05

來源:互聯網
上載者:User

【 聲明:著作權,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】

    模板對於學習C++的同學,其實並不陌生。函數有模板函數,類也有模板類。那麼這個模板模式是個什麼情況?我們可以思考一下,模板的本質是什麼。比如說,現在我們需要編寫一個簡單的比較模板函數。

[cpp] view plaincopy
  1. template <typename type>  
  2. int compare (type a, type b)  
  3. {  
  4.     return a > b ? 1 : 0;  
  5. }      

    模板函數提示我們,只要比較的邏輯是確定的,那麼不管是什麼資料類型,都會得到一個相應的結果。固然,這個比較的流程比較簡單,即使沒有採用模板函數也沒 有關係。但是,要是需要拆分的步驟很多,那麼又該怎麼辦呢?如果相通了這個問題,那麼也就明白了什麼是template模式。

    比方說,現在我們需要設計一個流程。這個流程有很多小的步驟完成。然而,其中每一個步驟的方法是多種多樣的,我們可以很多選擇。但是,所有步驟構成的邏輯 是唯一的,那麼我們該怎麼辦呢?其實也簡單。那就是在基類中除了流程函數外,其他的步驟函數全部設定為virtual函數即可。

[cpp] view plaincopy
  1. class basic  
  2. {  
  3. public:  
  4.     void basic() {}  
  5.     virtual ~basic() {}  
  6.     virtual void step1() {}  
  7.     virtual void step2() {}  
  8.     void process()  
  9.     {  
  10.         step1();  
  11.         step2();  
  12.     }  
  13. };  

    basic的類說明了基本的流程process是唯一的,所以我們要做的就是對step1和step2進行改寫。

[cpp] view plaincopy
  1. class data_A : public basic  
  2. {  
  3. public:  
  4.     data_A() {}  
  5.     ~data_A() {}  
  6.     void step1()   
  7.     {  
  8.         printf("step 1 in data_A!\n");  
  9.     }  
  10.   
  11.     void step2()  
  12.     {  
  13.         printf("step 2 in data_A!\n");  
  14.     }  
  15. };  

    所以,按照我個人的理解,這裡的template主要是一種流程上的統一,細節實現上的分離。明白了這個思想,那麼用C語言來描述template模式就不是什麼難事了。

[cpp] view plaincopy
  1. typedef struct _Basic  
  2. {  
  3.     void* pData;  
  4.     void (*step1) (struct _Basic* pBasic);  
  5.     void (*step2) (struct _Basic* pBasic);  
  6.     void (*process) (struct _Basic* pBasic);  
  7. }Basic;  

    因為在C++中process函數是直接繼承的,C語言下面沒有這個機制。所以,對於每一個process來說,process函數都是唯一的,但是我們 每一次操作的時候還是要去複製一遍函數指標。而step1和step2是不同的,所以各種方法可以用來靈活修改自己的處理邏輯,沒有問題。

[cpp] view plaincopy
  1. void process(struct _Basic* pBasic)  
  2. {  
  3.     pBasic->step1(pBasic);  
  4.     pBasic->step2(pBasic);  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.