2008-10-23 66 views
11

策略當我第一次發現了策略模式,我很驚訝,它提供給我和我的計劃看似無限的可能性。我可以更好地封裝模型的行爲,甚至可以即時交換這種行爲。但是該策略也可以用來爲包含對象提供特徵和有效載荷 - 在超類中聲明的數據。生活很好。的策略對抗政策和對戰略

class MyMonsterAI { float const see_radius_; virtual void attack() = 0; /* .. */ }; 
class ElveAI  { ElveAI() : see_radius_(150.0f) {} /* ... */ }; 
class CycloneAI  { CycloneAI() : see_radius_(50.0f) {} /* ... */ }; 
class Monster  { MyMonsterAI* ai_; }; 

而且走過來的政策模式,它可以讓我在供應參數含有類更大的靈活性 - 整個階級,但是裝備我很喜歡,雖然動態交換的行爲...這是不是太容易(除非部分政策是有策略的!)。

class MyMonsterTrait { typedef typename ElveAI AI; }; 

template< class MonsterTrait > 
class Monster : public MonsterTrait::AI 
{ 
    void idle (void) { attack(); } 
}; 

這兩種模式似乎都非常強大,我喜歡在不同的環境下使用這兩種模式。但我不確定在某些情況下是否有特定/典型/更實際的應用。

我想知道:你在哪裏使用的戰略和政策,地方?哪裏更適合?

+1

您的文章是相當多的,爲什麼我討厭C++ – Mecki 2008-10-23 20:25:11

+0

的總結,但它有一個很大的標題! – Mnebuerquo 2008-10-23 20:26:33

回答

21

政策在很大程度上是在編譯時設置,而策略是在運行時設置。此外,政策通常是C++的概念,並且只適用於其他語言(例如d)的一小部分,而戰略格局是提供給許多(大多數?)面向對象,把函數作爲第一類公民像Python語言和語言。

話雖這麼說:

  • 的策略,在編譯時被確定的,一般只在您想每個二進制基礎上的不同應用程序邏輯的特殊情況下非常有用。例如,你可能會開發出略微爲每個客戶定製,通過網絡接口是否,或用手,這將是一個基於策略的模式的軟件。

  • 策略是在運行時確定,而事實上可以動態改變。例如,你可能有它實現了對銷售人員比對支持組不同的用戶界面和邏輯的軟件,但他們都不得不面對同一客戶和許可信息等等,而不是兩個獨立維護的應用程序,你只需有一個應用程序,其界面根據需要更改。

- 亞當