歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C語言和設計模式(之模板模式)

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

日期:2017/3/1 10:46:42   编辑:Linux編程
模板對於學習C++的同學,其實並不陌生。函數有模板函數,類也有模板類。那麼這個模板模式是個什麼情況?我們可以思考一下,模板的本質是什麼。比如說,現在我們需要編寫一個簡單的比較模板函數。
  1. template <typename type>
  2. int compare (type a, type b)
  3. {
  4. return a > b ? 1 : 0;
  5. }
模板函數提示我們,只要比較的邏輯是確定的,那麼不管是什麼數據類型,都會得到一個相應的結果。固然,這個比較的流程比較簡單,即使沒有采用模板函數也沒有關系。但是,要是需要拆分的步驟很多,那麼又該怎麼辦呢?如果相通了這個問題,那麼也就明白了什麼是template模式。

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

  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進行改寫。
  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. void step2()
  11. {
  12. printf("step 2 in data_A!\n");
  13. }
  14. };
所以,按照我個人的理解,這裡的template主要是一種流程上的統一,細節實現上的分離。明白了這個思想,那麼用C語言來描述template模式就不是什麼難事了。
  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是不同的,所以各種方法可以用來靈活修改自己的處理邏輯,沒有問題。
  1. void process(struct _Basic* pBasic)
  2. {
  3. pBasic->step1(pBasic);
  4. pBasic->step2(pBasic);
  5. }
Copyright © Linux教程網 All Rights Reserved