1. ابصار پیٹرن کیا ہے

ابصار پیٹرن ایک رفتاری ڈیزائن پیٹرن ہے جو اشیاء کے درمیان ایک سے زیادہ تعلق قائم کرنے کے لئے استعمال ہوتا ہے۔ خاص طور پر، جب کوئی ایک اشیاء (جسے موضوع یا قابل مشاہدہ کہا جاتا ہے) تبدیل ہوتا ہے تو تمام اس کے تابعداریاں (جنہیں مشاہدہ کرنے والے کہا جاتا ہے) کو خود بخود مطلع کیا جاتا ہے اور انہیں تازہ کیا جاتا ہے۔ یہ پیٹرن موضوع اور مشاہدے کے درمیان لوس تعلق فراہم کرتا ہے، جس سے اشیاء کے درمیان علیحدگی اور لچک پیدا ہوتی ہے۔

2. ابصار پیٹرن کی خصوصیات اور فوائد

ابصار پیٹرن کی منفرد خصوصیات اور فوائد مند ہیں:

  • موضوع اور مشاہدے کے درمیان لوس تعلق، جہاں موضوع کو مشاہدوں کی مخصوص تفصیلات کو جاننے کی ضرورت نہیں ہوتی۔
  • مشاہدوں کو دینامیک طریقے سے جمع اور ہٹانے کی اجازت، جو نظام کو زیادہ لچکدار بناتا ہے۔
  • موضوع اور مشاہدوں کے درمیان کھلا بند اصول کی پیروی، جس سے آلات کی آزاد فراری اور دوبارہ استعمالیت ممکن ہوتی ہے۔
  • ایک سے زیادہ مشاہدوں کے درمیان ایک سے زیادہ تعلق قائم کرنا، جہاں ایک موضوع کے پاس متعدد مشاہدہ ہو سکتے ہیں۔

3. عملی استعمالات کی مثالیں

ابصار پیٹرن کے بہت سارے عملی استعمالات واقعی زندگی میں موجود ہوتے ہیں، جیسے:

  • GUI انٹرفیس میں واقعات کا ہینڈلنگ میکانیزم، جیسے کے بٹن دبانے پر کام کرنا۔
  • ریل ٹائم اسٹاک مارکیٹ کی قیمتوں کو نوٹیفائی کرنا۔
  • ای-کامرس پلیٹ فارم پر تشہیرات کی نوٹیفکیشن۔

4. Golang میں ابصار پیٹرن کی تنصیب

4.1 UML کلاس شکل

Observer Pattern in Golang

4.2 مثال کی تعاریف

اس مثال میں ہمیں ایک موضوع (Subject) اور دو مشاہدہ (ObserverA اور ObserverB) ہیں۔ موضوع مشاہدوں کو رجسٹر کرسکتا ہے، انہیں منسوخ کرسکتا ہے اور انہیں مطلع کرسکتا ہے۔

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("Observer A is notified.")
}

type ConcreteObserverB struct {}

func (observer *ConcreteObserverB) Update() {
    fmt.Println("Observer B is notified.")
}

4.4 مثال کوڈ ڈیمو

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

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

    subject.NotifyObservers()

    subject.RemoveObserver(observerA)

    subject.NotifyObservers()
}

Output:

Observer A is notified.
Observer B is notified.
Observer B is notified.

اوپر دی گئی مثالیں کوڈ ایک اشیاء کے مخصوص تنصیب کا ظاہر کرتی ہیں۔ موضوع (ConcreteSubject) نے دو مشاہدوں (ObserverA اور ObserverB) کو رجسٹر کیا اور پھر ان دونوں مشاہدوں کو مطلع کیا۔ اس کے بعد، مشاہدہ A کو موضوع سے منسوخ کیا گیا اور باقی مشاہدہ B کو دوبارہ مطلع کیا گیا۔