আমি দুটি অ্যাবস্ট্রাক্ট ক্লাস সাবজেক্ট এবং অবজারভার তৈরি করেছি যা ক্লাসিক অবজারভার প্যাটার্ন ইন্টারফেসকে সংজ্ঞায়িত করে। আমি পর্যবেক্ষক প্যাটার্নটি বাস্তবায়নের জন্য তাদের কাছ থেকে পেয়েছি। কোনও পর্যবেক্ষক এর মতো দেখতে পাবেন:
void MyClass::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
এটি ঠিক আছে এবং এটি আমাকে বলে যে কিছু পরিবর্তন করেছে। যাইহোক, এটি কি বলেছে তা আমাকে জানায় না । কখনও কখনও এটি ঠিক থাকে কারণ আমি কেবল সর্বশেষতম ডেটাগুলির জন্য সাবজেক্টটি অনুসন্ধান করতে চলেছি, তবে অন্যান্য সময়ে সাবজেক্টে ঠিক কী পরিবর্তন হয়েছে তা আমার জানতে হবে। আমি জাভাতে লক্ষ্য করেছি যে তারা পরিবর্তন হয়েছে সে সম্পর্কে সম্ভবত বিশদ উল্লেখ করার জন্য তাদের একটি বিজ্ঞপ্তি-আবশ্যক পদ্ধতি () পদ্ধতি এবং একটি বিজ্ঞপ্তি-আব্সার্স (অবজেক্ট আর্গ) উভয় পদ্ধতি রয়েছে ।
আমার ক্ষেত্রে আমার জানতে হবে যে বিষয়টি নিয়ে দু'একটি ভিন্ন ক্রিয়াকলাপ ঘটেছে এবং যদি এটি কোনও নির্দিষ্ট ক্রিয়া হয় তবে সেই ক্রিয়া সম্পর্কিত কোনও পূর্ণসংখ্যার সংখ্যাটি জানতে হবে।
সুতরাং আমার প্রশ্নগুলি হ'ল:
- জেনেরিক আর্গুমেন্ট (জাভা যেমন করে) পাস করার সি ++ উপায় কী?
- পর্যবেক্ষক এমনকি সেরা প্যাটার্ন? সম্ভবত কোন ধরণের ইভেন্ট সিস্টেম?
হালনাগাদ
আমি এই নিবন্ধটি পেয়েছি যা পর্যবেক্ষক প্যাটার্নকে টেম্পলেট করার বিষয়ে আলোচনা করে: টেমপ্লেটগুলি সহ একটি বিষয় / পর্যবেক্ষক নিদর্শন বাস্তবায়ন করে । এটি আমাকে বিস্মিত করেছে যে আপনি কোনও যুক্তি টেম্পলেট করতে পারেন কিনা।
আমি এই স্ট্যাক ওভারফ্লো প্রশ্নটি পেয়েছি যা আর্গুমেন্টকে টেম্পলেট করার বিষয়ে কথা বলে: টেমপ্লেট ভিত্তিক সাবজেক্ট পর্যবেক্ষক প্যাটার্ন - আমাকে স্ট্যাটিক_কাস্ট বা ডায়নামিক_কাস্ট ব্যবহার করা উচিত ? তবে ওপিতে মনে হচ্ছে এমন কোনও সমস্যা আছে যার উত্তর কেউ দেয়নি।
অন্য যে জিনিসটি আমি করতে পারি তা হ'ল ইভেন্ট পদ্ধতিটি অবজেক্ট হিসাবে নেওয়ার জন্য আপডেট পদ্ধতিটি পরিবর্তন করুন:
void MyClass::Update(Subject *subject, EventArg arg)
{
...
এবং তারপরে নির্দিষ্ট আর্গুমেন্ট ডেটার জন্য ইভেন্টআর্গের সাবক্লাসগুলি তৈরি করুন এবং তারপরে আমি অনুমান করি যে এটি আপডেট পদ্ধতির মধ্যে নির্দিষ্ট সাবক্লাসে ফিরে যাবে।
আপডেট 2
এছাড়াও একটি নিবন্ধ পাওয়া গেছে, একটি অ্যাসিনক্রোনাস বার্তা-ভিত্তিক সি ++ ফ্রেমওয়ার্ক তৈরি করার সময়; অংশ ২ যা সাবজেক্টটি কী পরিবর্তন হয়েছে সে সম্পর্কে বিস্তারিত জানার বিষয়ে আলোচনা করে ।
আমি এখন Boost.Signals ব্যবহারের জন্য গুরুত্ব সহকারে বিবেচনা করছি । আমার নিজের পর্যবেক্ষক প্যাটার্নটি ব্যবহার করা যখন এটি সহজ ছিল তখন তা বোধগম্য হয়েছিল, তবে প্রকারটি এবং আর্গুমেন্টকে জটিল করে জটিল হতে শুরু করে। এবং আমার বুস্ট ডাবল সিগন্যালস 2 এর থ্রেড সুরক্ষা প্রয়োজন।
আপডেট 3
আমি পর্যবেক্ষক প্যাটার্নে কিছু আকর্ষণীয় নিবন্ধগুলিও পেয়েছি:
ভেষজ সুতার দ্বারা সাধারণ পর্যবেক্ষক
সি ++ - পার্ট 1 এ পর্যবেক্ষক প্যাটার্নটি কার্যকর করা
পর্যবেক্ষক ডিজাইন প্যাটার্ন বাস্তবায়নের অভিজ্ঞতা (অংশ 2)
পর্যবেক্ষক নকশা প্যাটার্ন বাস্তবায়নের অভিজ্ঞতা (অংশ 3)
যাইহোক, আমি বুস্ট.সিনগালস ব্যবহার করে আমার বাস্তবায়নটি পরিবর্তন করেছি যা সম্ভবত আমার পক্ষে আমার উদ্দেশ্যে স্ফোটিত হয়েছে, সফলভাবে কাজ করছে। এবং সম্ভবত ফোলা বা গতির কোনও উদ্বেগ অপ্রাসঙ্গিক।