मैं @DocBrown द्वारा उत्तर में उल्लिखित रणनीति के पक्ष में हूं ।
मैं उत्तर में सुधार का सुझाव देने जा रहा हूं।
कॉल करता है
myMap.Add(1,new Strategy1());
myMap.Add(2,new Strategy2());
myMap.Add(3,new Strategy3());
वितरित किया जा सकता है। आपको दूसरी रणनीति जोड़ने के लिए उसी फ़ाइल पर वापस जाने की ज़रूरत नहीं है, जो ओपन-क्लोज्ड सिद्धांत का बेहतर तरीके से पालन करता है।
कहते हैं कि आप Strategy1फ़ाइल Strategy1.cpp में लागू करें । आप इसमें कोड के निम्नलिखित ब्लॉक कर सकते हैं।
namespace Strategy1_Impl
{
struct Initializer
{
Initializer()
{
getMap().Add(1, new Strategy1());
}
};
}
using namespace Strategy1_Impl;
static Initializer initializer;
आप प्रत्येक StategyN.cpp फ़ाइल में समान कोड दोहरा सकते हैं। जैसा कि आप देख सकते हैं, कि बार-बार कोड होगा। कोड दोहराव को कम करने के लिए, आप एक टेम्पलेट का उपयोग कर सकते हैं, जिसे सभी Strategyवर्गों के लिए सुलभ फ़ाइल में डाला जा सकता है ।
namespace StrategyHelper
{
template <int N, typename StrategyType> struct Initializer
{
Initializer()
{
getMap().Add(N, new StrategyType());
}
};
}
उसके बाद, आपको Strategy1.cpp में केवल एक चीज का उपयोग करना है:
static StrategyHelper::Initializer<1, Strategy1> initializer;
StrategyN.cpp में इसी लाइन है:
static StrategyHelper::Initializer<N, StrategyN> initializer;
आप ठोस रणनीति वर्गों के लिए एक वर्ग टेम्पलेट का उपयोग करके टेम्पलेट्स का उपयोग दूसरे स्तर तक ले जा सकते हैं।
class Strategy { ... };
template <int N> class ConcreteStrategy;
और फिर, इसके बजाय Strategy1, का उपयोग करें ConcreteStrategy<1>।
template <> class ConcreteStrategy<1> : public Strategy { ... };
StrategyS को रजिस्टर करने के लिए हेल्पर क्लास बदलें :
namespace StrategyHelper
{
template <int N> struct Initializer
{
Initializer()
{
getMap().Add(N, new ConcreteStrategy<N>());
}
};
}
Strateg1.cpp में कोड को इसमें बदलें:
static StrategyHelper::Initializer<1> initializer;
StrategN.cpp में कोड बदलें:
static StrategyHelper::Initializer<N> initializer;