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實現了一套類型消除機制,可以統一處理不同的函數對象類型。