Abstract
一般若用泛型實現Strategy Pattern,缺點是無法動態改變strategy,本文將介紹可以動態改變的泛型Strategy Pattern。

Introduction
正統若用OO實現Strategy Pattern,會用到interface和virtual。

OO Virtual
(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)

}


這種做法有著OO傳統的優點,可以動態改變strategy。

泛型
若用泛型實現Strategy Pattern,一般我們會使用class template。
(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)

}


由於使用class template,已經在compile-time定了下來,所以無法在由run-time改變strategy。

但別忘了template另外一個技術:function template,配合boost::any則可實現run-time改變strategy。

泛型 by boost::any
(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)

}


Grapher由class template改成function template,關鍵在於45行

(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)private:
(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)  any _drawStrategy; 


使用了boost::any,簡單的說,他允許任何型別,類似C#的Object,所以藉此能容納各種strategy。

37行

(原創) 我的Design Pattern之旅[8]:如何使用泛型打造動態改變的Strategy Pattern? (OO) (Design Pattern) (C/C++) (template) (boost)template<typename Strategy>
}


若要由boost::any使用某型別的member function,必須先用any_cast轉型成才可使用。

Conclusion
若改用function template和boost::any,很多Design Pattern皆可使用泛型實現,同時又可在run-time改變,一掃泛型無法在run-time改變的缺點。

Reference
Bjorn Karlsson, Beyond C++ Standard Library : An Introduction to Boost. 2005

相关文章: