আমি কৌশলের রূপরেখা পক্ষে জোরালোভাবে am @DocBrown দ্বারা উত্তর ।
আমি উত্তরের একটি উন্নতি প্রস্তাব করতে যাচ্ছি।
কল
myMap.Add(1,new Strategy1());
myMap.Add(2,new Strategy2());
myMap.Add(3,new Strategy3());
বিতরণ করা যেতে পারে। অন্য কৌশল যুক্ত করতে আপনাকে একই ফাইলটিতে ফিরে যেতে হবে না, যা ওপেন-ক্লোজড নীতিটি আরও ভালভাবে মেনে চলে।
বলুন আপনি Strategy1কৌশল 1.cpp ফাইলটিতে প্রয়োগ করেন। এটিতে আপনার নীচের কোডের ব্লক থাকতে পারে।
namespace Strategy1_Impl
{
struct Initializer
{
Initializer()
{
getMap().Add(1, new Strategy1());
}
};
}
using namespace Strategy1_Impl;
static Initializer initializer;
আপনি প্রতিটি স্ট্যাটাইএনএনপিপি ফাইলগুলিতে একই কোডটি পুনরাবৃত্তি করতে পারেন। আপনি দেখতে পাচ্ছেন যে এটি প্রচুর পুনরাবৃত্তি কোড হবে। কোড সদৃশতা হ্রাস করতে, আপনি একটি টেম্পলেট ব্যবহার করতে পারেন যা কোনও ফাইলের মধ্যে রাখা যেতে পারে যা সমস্ত Strategyক্লাসে অ্যাক্সেসযোগ্য ।
namespace StrategyHelper
{
template <int N, typename StrategyType> struct Initializer
{
Initializer()
{
getMap().Add(N, new StrategyType());
}
};
}
এর পরে, কৌশল 1.cpp এ আপনাকে ব্যবহার করতে হবে কেবলমাত্র:
static StrategyHelper::Initializer<1, Strategy1> initializer;
কৌশল N.cpp এ সম্পর্কিত লাইনটি হ'ল:
static StrategyHelper::Initializer<N, StrategyN> initializer;
আপনি কংক্রিট কৌশল ক্লাসগুলির জন্য শ্রেণিক টেম্পলেট ব্যবহার করে টেমপ্লেটগুলির ব্যবহারকে অন্য স্তরে নিয়ে যেতে পারেন।
class Strategy { ... };
template <int N> class ConcreteStrategy;
এবং তারপরে, পরিবর্তে Strategy1, ব্যবহার করুন ConcreteStrategy<1>।
template <> class ConcreteStrategy<1> : public Strategy { ... };
এইগুলিতে নিবন্ধকরণ করতে সহায়ক শ্রেণি পরিবর্তন করুন Strategy:
namespace StrategyHelper
{
template <int N> struct Initializer
{
Initializer()
{
getMap().Add(N, new ConcreteStrategy<N>());
}
};
}
স্ট্র্যাটেজি 1 সিপিতে কোডটি এতে পরিবর্তন করুন:
static StrategyHelper::Initializer<1> initializer;
স্ট্র্যাটেজিএন সিপ্পিতে কোডটি এতে পরিবর্তন করুন:
static StrategyHelper::Initializer<N> initializer;