1. অবজারভার প্যাটার্ন কি

অবজারভার প্যাটার্ন হলো একটি ব্যাবহারিক ডিজাইন প্যাটার্ন, যা অবজেক্টগুলির মধ্যে এক-থেকে অনেক নির্ভরতা স্থাপন করার জন্য ব্যবহৃত হয়। বিশেষত, যখন একটি অবজেক্ট (যা সাবজেক্ট বা অবজারভ অথবা অবজারবল হিসেবে পরিচিত) পরিবর্তন করে, তখন সমস্ত এর নির্ভরতাগুলি (যা অবজারভার হিসেবে পরিচিত) স্বয়ংক্রিয়ভাবে অবহিত এবং আপডেট হয়। এই প্যাটার্নটি সাবজেক্টস এবং অবজারভার মধ্যে তুলনামূলক দূরত্ব দেয়, অতএব অবজেক্টগুলির মধ্যে ডিকাপলিং এবং ফ্লেক্সিবিলিটি অর্জন করা যায়।

2. চরিত্রিতা এবং অবজারভার প্যাটার্নের সুবিধা

অবজারভার প্যাটার্নের নিম্নলিখিত চরিত্রিতা এবং সুবিধা রয়েছে:

  • সাবজেক্টস এবং অবজারভার মধ্যে লুস কাপলিং, যেখানে সাবজেক্টটির আবারণের নির্দিষ্ট বিবরণ জানার প্রয়োজন নেই।
  • অবজারভারে পরিনতি এবং অপসারণের ক্ষমতা, যা সিস্টেমকে আরও ফ্লেক্সিবল করে।
  • সাবজেক্টস এবং অবজারভার মধ্যে খোলা-বন্ধ সূত্র অনুসরণ করে, যেখানে সাবজেক্টগুলির মধ্যে স্বাধীন এক্সটেনশন এবং পুনর্ব্যবহার সম্ভব হয়।
  • এক-থেকে অনেক নির্ভরতা সম্পর্ক স্থাপন করা যায়, যেখানে একটি সাবজেক্ট বহু অবজারভার রাখতে পারে।

3. অবজারভার প্যাটার্নের প্রায়োগিক অ্যাপ্লিকেশন উদাহরণ

অবজারভার প্যাটার্নটির বাস্তব জীবনে বহুত অনেক উপযুক্ত অ্যাপ্লিকেশন রয়েছে, যেমন:

  • GUI ইন্টারফেসে ইভেন্ট হ্যান্ডলিং ম্যাকানিজম, যেমন যখন একটি বোতাম ক্লিক করা হয় তখন পরিক্ষারত অ্যাকশন হ্যান্ডলিং।
  • রিয়েল-টাইম স্টক মার্কেট বাজার দিতে সেরা মূল্য পুশ।
  • ই-কমার্স প্ল্যাটফর্মে প্রচারণামূলক কার্যক্রমের বিজ্ঞপ্তি।

4. গোলাঙ্গে অবজারভার প্যাটার্ন ইমপ্লিমেন্টেশন

4.1 UML ক্লাস ডায়াগ্রাম

গোলাঙ্গে অবজার প্যাটার্ন

4.2 উদাহরণ এ্যাপ্লিকেশন

এই উদাহরণে, আমাদের একটি সাবজেক্ট (সাবজেক্ট) এবং দুটি অবজারভার (অবজারভার A এবং অবজারভার B) আছে। সাবজেক্টটি অবজারভার আপনার আবদ্ধ করতে, অবজারভার সরানো এবং অবজারভারদের সাপ্তাহিক করতে পারে।

4.3 ইমপ্লিমেন্টেশন পদক্ষেপ

4.3.1 সাবজেক্ট ইন্টারফেস এবং কনক্রিট সাবজেক্ট ক্লাস তৈরি করুন

type Subject interface {
    RegisterObserver(observer Observer)
    RemoveObserver(observer Observer)
    NotifyObservers()
}

type ConcreteSubject struct {
    observers []Observer
}

// লিসেনার অবজেক্ট নিবন্ধন করুন
func (subject *ConcreteSubject) RegisterObserver(observer Observer) {
    subject.observers = append(subject.observers, observer)
}

// লিসেনার অবজেক্ট সরান
func (subject *ConcreteSubject) RemoveObserver(observer Observer) {
    for i, obs := range subject.observers {
        if obs == observer {
            subject.observers = append(subject.observers[:i], subject.observers[i+1:]...)
            break
        }
    }
}

// ইভেন্ট বিজ্ঞপ্তি প্রায়োগিকমূলক করুন
func (subject *ConcreteSubject) NotifyObservers() {
    for _, observer := range subject.observers {
        observer.Update()
    }
}

4.3.2 অবজারভার ইন্টারফেস এবং কনক্রিট অবজারভার ক্লাস তৈরি করুন

type Observer interface {
    Update()
}

type ConcreteObserverA struct {}

func (observer *ConcreteObserverA) Update() {
    fmt.Println("অবজারভার A এর নোটিফাই হয়েছে।")
}

type ConcreteObserverB struct {}

func (observer *ConcreteObserverB) Update() {
    fmt.Println("অবজারভার B এর নোটিফাই হয়েছে।")
}

4.4 উদাহরণ কোড ডেমো

func main() {
    subject := &ConcreteSubject{}
    observerA := &ConcreteObserverA{}
    observerB := &ConcreteObserverB{}

    subject.RegisterObserver(observerA)
    subject.RegisterObserver(observerB)

    subject.NotifyObservers()

    subject.RemoveObserver(observerA)

    subject.NotifyObservers()
}

আউটপুট:

অবজারভার A এর নোটিফিকেশন হয়েছে।
অবজারভার B এর নোটিফিকেশন হয়েছে।
অবজারভার B এর নোটিফিকেশন হয়েছে।

উপরের উদাহরণ কোডটি অবজারভার প্যাটার্নের বিশেষ অনুসন্ধান দেয়। সাবজেক্ট (কনক্রিট সাবজেক্ট) দুটি অবজারভার (অবজারভার A এবং অবজারভার B) রেজিস্টার করেছিল এবং তারপরে এই দুইটি অবজারভারকে বিজ্ঞপ্তি করেছিল। এরপরে, অবজার A থেকে সাবজেক্ট থেকে অবিলম্বে মুছে ফেলা হয়েছিল এবং অবিলম্বে অবজার B একবার আবার বিজ্ঞপ্তি হয়েছিল।