efective C++ 條款35:考慮除virtual函數外的其他選擇

1.籍由NVI手法 實現 Template Method 模式

Template Method 模式

    對於某一個業務邏輯(算法實現)在不同的對象中有不同的細節實現,但是邏輯(算法)的框架(或通用的應用算法)是相同的。Template Method提供了這種情況的一個實現框架。

Template Method模式是採用繼承的方式實現這一點:將邏輯(算法)框架放在抽象基類中,並定義好細節的接口,子類中實現細節。

其關鍵點就是將通用算法封裝在抽象基類中

NVI手法中所用的non_virtual函數成爲virtual函數的外敷器。

NVI手法的優點在於

外敷器確保得以在一個virtual函數被調用之前設定好情景,並在調用結束後清理情景。

 

2.籍由Function pointer 實現 Strategy模式

Strategy模式

Strategy模式解決的是和Template Method模式類似的問題,但是Strategy模式是將邏輯(算法)封裝到一個類中,並採取組合(委託)的方式解決這個問題。

  

    要實現一個抽象接口,繼承是一種方式:我們將抽象接口聲明在基類中,將具體的實現放在具體子類中。組合(委託)是另外一種方式:我們將接口的實現放在被組合對象中,將抽象接口放在組合類中。

3.籍由std:function完成Strategy模式

通過std::function對C++中各種可調用實體(普通函數、Lambda表達式、函數指針、以及其它函數對象等)的封裝,形成一個新的可調用的std::function對象;

關於可調用實體轉換爲std::function對象需要遵守以下兩條原則:

轉換後的std::function對象的參數能轉換爲可調用實體的參數;

可調用實體的返回值能轉換爲std::function對象的返回值。

 

std::function實現了一套類型消除機制,可以統一處理不同的函數對象類型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章