অবজার্ভার ডিসাইন প্যাটার্ন (Observer Design Pattern)
যেকোনো ডিসাইন প্যাটার্ন বোঝার জন্য সেটা কী সমস্যার সমাধান করে সেটা খুব ভালো করে বোঝা জরুরি।
ব্যারিস্টার সুমন অনেকদিন থেকেই নাগরিক বিভিন্ন সমস্যা নিয়ে খুব ফেইসবুক লাইভ করছেন। ধরা যাক, আপনি উনার সাংঘাতিক বড় একজন ফ্যান। উনার ফেইসবুক পেইজে “লাইক” দিয়ে রাখলেন। এখন যখনই ব্যারিস্টার সুমন লাইভে আসেন, আপনি সাথে সাথেই আপনার ফেসবুকে একটা নোটিফিকেশন পান। সেই নোটিফিকেশনে ক্লিক করলে উনার পেইজে গিয়ে পুরো ভিডিওটা তখনই দেখতে পারেন।
এই “লাইক” দিয়ে রাখার ব্যবস্থা না থাকলে কি হতো সেটা একটু ভেবে দেখা যাক। সেক্ষেত্রে ঘন্টায় কয়েকবার আপনাকে হয়তো উনার পেইজে গিয়ে দেখতে হতো নতুন কোনো ভিডিও পোস্ট হয়েছে কিনা। আবার টাইমিং ঠিক মতো না হলে ভিডিও ‘লাইভ’ দেখা সম্ভব নাও হতে পারতো। ফেইসবুক খুব সম্ভবত (আমি মোটামুটি নিশ্চিত) অবজার্ভার ডিসাইন প্যাটার্ন ব্যবহার করে ব্যাপারটা ইমপ্লিমেন্ট করে থাকে। এখন দেখা যাক, অবজার্ভার প্যাটার্ন কিভাবে এই কাজটা করে।
একটু ভেবে দেখুন, পুরো ব্যাপারটাতে ২ টা Actor আছে। সাবজেক্ট (ব্যারিস্টার সুমনের ফেইসবুক পেইজ) আর অবজার্ভার (আপনি বা অন্য কোনো ফলোয়ার)। সাবজেক্ট আর অবজার্ভার — কার কি দায়িত্ব সেটা একটু ভেবে দেখা যাক। সাবজেক্ট-এর একটা ‘রেজিষ্টার’ মেথড দিতে হবে (যেমন ‘লাইক’ বাটন) যেটা ব্যবহার করে নোটিফিকেশন প্রার্থী অবজার্ভার সাবজেক্টের কাছে নিজেকে রেজিস্টার বা সাবস্ক্রাইব করতে পারবে। একই ভাবে সাবজেক্টকে আনরেজিস্টার মেথড (যেমন ‘আন-লাইক’ বা ‘আনসাবস্ক্রাইব’ অপশন) দিতে হবে যাতে করে (নোটিফিকেশন পেতে পেতে) বিরক্ত অবজার্ভার নিজেকে সরিয়ে নিতে পারে। আবার সাবজেক্টের একটা ‘নোটিফাই -অল’ মেথড থাকতে হবে যেটা ব্যবহার করে সে তার সব ফলোয়ারকে বা অবজার্ভারদেরকে স্টেটাস নোটিফাই করতে পারবে।
এবার দেখি অবজার্ভারের দায়িত্ব কি। অবজার্ভারকে বলে দিতে হবে সাবজেক্ট কিভাবে তাকে নোটিফাই করবে। অবজার্ভারের একটা আপডেট মেথড থাকতে হবে যেটা ব্যবহার করে সাবজেক্ট তাকে নোটিফাই করবে। যেমন হতে পারে, অবসার্ভাররের ফেইসবুক পেইজে নোটিফিকেশন-এর ঘন্টার সিম্বলে একটা লাল চিহ্ন এঁকে দিতে হবে।
এই যে সাবজেক্ট-অবজার্ভারের নিয়ম নীতি, এইগুলো কিন্তু সব সাবজেক্ট অর্থাৎ ফেসবুকে অন্যান্য সেলিব্রেটিদের পেইজ কিংবা তাঁদের অসংখ্য অবজার্ভার বা ফলোয়ার সবারই মেনে চলতে হবে। এর বাইরে সাবজেক্ট আর অবজার্ভারের নিজস্ব মেথড থাকতেই পারে, তাতে কোনো সমস্যা নেই। জাভাতে ইন্টারফেসের (Java Interface) মাধম্যে এই ধরণের নিয়ম-নীতি গুলো নির্দিষ্ট করে দেয়া হয়, যেমন নিচের কোডে (ছবি ১)।
এখন দেখা যাক, ব্যারিস্টার সুমন (বা অন্য কোনো সেলিব্রেটি) তাঁর ফেইসবুক পেইজ খুললে তা কিভাবে সাবজেক্টের নিয়মগুলো ইম্প্লিমেনন্ট করে (ছবি ২)। খেয়াল করুন, তাঁর পেইজে একটা ArrayList থাকবে যেটা কিনা সব ফলোয়ারের বা অবজার্ভারের রেফেরেন্স রাখবে (সাইড নোট: অন্য ক্লাসের রেফারেন্স নিজের ক্লাসে রাখাকেই জাভাতে Composition কিংবা HAS-A রিলেশনশিপ বলে)। তিনি যখনই কোনো স্টেটাস আপডেট দেবেন, তাঁর পেইজের ‘notifyObservers()’ মেথড এই লিস্ট ব্যবহার করে সব ফলোয়ারকে নোটিফাই করবে।
আবার তাঁর সব ফলোয়ার কিভাবে অবজার্ভারের সব নিয়ম ইমপ্লিমেন্ট করে সেটা দেখা যাক (ছবি ৩)। ধরা যাক, ফলোয়ারের একটা প্রোফাইল নাম থাকবে যেটা পেইজ খোলার সময় ঠিক করতে হবে (Java Constructor মেথড ব্যবহার করে)। আর অবজার্ভারের নিয়ম মেনে একটা update () মেথড ইমপ্লিমেন্ট করবে যেটা নোটিফিকেশন কিভাবে শো করবে, সেটা বলে দিবে।
ব্যস, আমাদের অবজার্ভার ডিসাইন প্যাটার্ন ইমপ্লিমেন্ট করা শেষ। এইবার একটা টেস্ট লিখে দেখা যাক (ছবি ৪)। ধরা যাক, মফিজ আর মজনু নামে ব্যারিস্টার সুমনের দুইজন কড়া ফ্যান আছে। যারা তাদের ফেইসবুক পেইজ খুলে ব্যারিস্টার সুমনের পেইজে “লাইক” দিয়ে রেখেছে। এখন ব্যারিস্টার সুমন কোনো স্টেটাস দিলেই সাথে সাথে মফিজ আর মজনু নোটিফিকেশন পাবে।
আর মফিজ, মজনু আসলেই যে নোটিফিকেশন আলাদা আলাদা ভাবে পায়, সেটা কোডের আউটপুট দেখে বোঝা যাবে (ছবি ৫)।
আশা করি বুঝতে পেরেছেন। পুরো কোডটা পেইস্টবিন.কম -এ পেইস্ট করে দিলাম (এই লিংকে)। ইচ্ছা হলে ডাউনলোড করে চালিয়ে দেখতে পারেন। আর কারো দেখতে বা নামাতে সমস্যা হলে কমেন্টে জানালে আমি আবার শেয়ার করবো।
আমার ব্লগে (এই লিংকে) অন্যান্য ডিসাইন প্যাটার্ন নিয়ে বাংলায় লেখা আমার পোস্ট গুলো পড়ে দেখার অনুরোধ থাকলো।ধন্যবাদ!
Originally published at http://software-engineering-notes-in-bangla.blogspot.com.