C++編程中應用設計形式中的policy戰略形式的實例講授。本站提示廣大學習愛好者:(C++編程中應用設計形式中的policy戰略形式的實例講授)文章只能為提供參考,不一定能成為您想要的結果。以下是C++編程中應用設計形式中的policy戰略形式的實例講授正文
在看《C++設計新思想》的時刻,發明在一開端就年夜篇幅的引見戰略形式(policy),戰略形式不屬於經典設計形式中的一種,然則其其實我們平常的開辟中是必弗成少的。policy,戰略,方針,這裡的意思是指把龐雜功效的類盡可能的拆分為功效單一的簡略類的組合,簡略的類只擔任純真行動或構造的某一方面。增長法式庫的彈性,可復用性,可擴大性。policy是一個虛擬的概念,他界說了某一類class的一些接口標准,其實不與C++語法的症結字對應,只是一個籠統的概念。
實例1:
//policy形式的罕見應用實例smartptr, template < class T, template <class> class CheckingPolicy, template <class> class ThreadingModel > class SmartPtr : public CheckingPolicy<T> , public ThreadingModel<SmartPtr> { T* operator->() { typename ThreadingModel<SmartPtr>::Lock guard(*this); CheckingPolicy<T>::Check(pointee_); return pointee_; } private: T* pointee_; };
實例2,好比說:我們界說一個policy,他是一個帶有參數T的一個模版,他必需有一個Create函數,且前往T類型指針。關於這個界說,我們可以有分歧的完成,從而知足分歧用戶的分歧的需求。
template <class T> struct OpNewCreator { static T* Create() { return new T; } }; template <class T> struct MallocCreator { static T* Create() { void* buf = std::malloc(sizeof(T)); if (!buf) return 0; return new(buf) T; } }; template <class T> struct PrototypeCreator { PrototypeCreator(T* pObj = 0) :pPrototype_(pObj) {} T* Create() { return pPrototype_ ? pPrototype_->Clone() : 0; } T* GetPrototype() { return pPrototype_; } void SetPrototype(T* pObj) { pPrototype_ = pObj; } private: T* pPrototype_; }; //test class class Widget { }; //挪用辦法一: template <class CreationPolicy> class WidgetManager : public CreationPolicy { }; void main() { typedef WidgetManager< OpNewCreator<Widget> > MyWidgetMgr; } //挪用辦法二:由於普通Manager是特定於某一類的class,所以在Manager中就指定要處置的class類型。 template <template <class Created> class CreationPolicy> class WidgetManager : public CreationPolicy<Widget> { }; void main() { // Application code typedef WidgetManager<OpNewCreator> MyWidgetMgr; }
關於下面一個戰略有3中分歧的完成,從而便可以知足分歧的客戶的需求。
然則關於下面的應用,我們還可以有更好的修正:由於Policy的完成class普通會被繼續,所以我們要斟酌他的析構,普通的我們使析構函數virtual,然則這裡會影響template的靜態編譯特征,影響效力,所以我們應用protected或private的析構函數,既不影響繼續類對基類的析構,也不影響應用。
如修正以下:
template <class T> struct OpNewCreator { static T* Create() { return new T; } protected: ~OpNewCreator() {} };
我們還可以修正下面的manger,完成creator policy的switch:
template <template <class> class CreationPolicy> class WidgetManager : public CreationPolicy<Widget> { void SwitchPrototype(Widget* pNewPrototype) { CreationPolicy<Widget>& myPolicy = *this; delete myPolicy.GetPrototype(); myPolicy.SetPrototype(pNewPrototype); } };
policy 形式對我們創立可復用,可擴大的庫的開辟有異常主要的感化,是OO的根本的設准繩式之一。
總的說來戰略形式:
長處:
1、 應用戰略形式可以免應用多重前提轉移語句。多重轉移語句不容易保護。
2、 戰略形式讓你可以靜態的轉變對象的行動,靜態修正戰略
缺陷:
1、客戶端必需曉得一切的戰略類,並自行決議應用哪個戰略類。
2、類過量---戰略形式形成許多的戰略類,每一個詳細戰略類都邑發生一個新類。(這點可以經由過程享元形式來戰勝類過量)