मैं @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 { ... };
Strategy
S को रजिस्टर करने के लिए हेल्पर क्लास बदलें :
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;