Observer Design Pattern এর ধারণা

Java Technologies - জাভা ইউটিল.প্যাকেজ (Java.util Package) - Observer এবং Observable ক্লাস
251

Observer Design Pattern হল একটি Behavioral Design Pattern, যা একটি one-to-many সম্পর্ক প্রতিষ্ঠা করে। এই প্যাটার্নে, একটি অবজারভেবল (subject) অবজারভার (observers) এর তালিকায় পরিবর্তন ঘটালে, সে পরিবর্তনগুলো স্বয়ংক্রিয়ভাবে অবজারভারদের কাছে পাঠানো হয়। এটি একটি ইভেন্ট-চালিত মডেল, যেখানে অবজারভারগণ একটি নির্দিষ্ট অবজারভেবল অবজেক্টের সাথে যুক্ত থাকে এবং অবজারভেবলটি যখন পরিবর্তিত হয়, তখন অবজারভারগুলো আপডেট হয়।

এটি সাধারণত GUI অ্যাপ্লিকেশন, event-driven programming, এবং notification systems-এ ব্যবহৃত হয়। উদাহরণস্বরূপ, যখন একটি ওয়েব পেজের কোনো নির্দিষ্ট তথ্য পরিবর্তিত হয়, তখন সেই তথ্যের সাথে যুক্ত সমস্ত ইউজারকে অবহিত করতে Observer Design Pattern ব্যবহার করা হয়।

Observer Design Pattern এর উপাদান:

  1. Subject (Observable):
    • এটি এমন একটি অবজেক্ট যা নিজের অবস্থান বা অবস্থা পরিবর্তিত হলে অবজারভারদের অবগত করে দেয়। এটি এক বা একাধিক অবজারভারকে যুক্ত করতে এবং তাদের অবস্থা পরিবর্তনের খবর পাঠাতে সক্ষম হয়।
  2. Observer:
    • এটি একটি ইন্টারফেস বা ক্লাস যা Subject এর পরিবর্তন সম্পর্কে অবহিত হয় এবং তার প্রাসঙ্গিক পরিবর্তনকে গ্রহণ করে।
  3. ConcreteSubject:
    • এটি Subject ইন্টারফেসের বাস্তবায়ন, যা অবজারভারদের সাথে সংযুক্ত থাকে এবং তাদেরকে অবহিত করে যখন তার অবস্থা পরিবর্তিত হয়।
  4. ConcreteObserver:
    • এটি Observer ইন্টারফেসের বাস্তবায়ন, যা ConcreteSubject থেকে আপডেট পায় এবং সেই অনুযায়ী আচরণ করে।

Observer Design Pattern এর ব্যবহারের উদাহরণ:

Java এর Observer এবং Observable ক্লাসগুলি এই প্যাটার্নের বাস্তবায়ন সরবরাহ করে। তবে, Java 9 থেকে Observable ক্লাসটি deprecated (অবসরপ্রাপ্ত) হয়ে গেছে এবং এখনকার পদ্ধতিতে Observer Design Pattern বাস্তবায়ন করার জন্য java.beans প্যাকেজের PropertyChangeListener এবং অন্যান্য API ব্যবহার করা হয়। তবে, আমরা এখনো Observable এবং Observer ক্লাসের মাধ্যমে এই প্যাটার্নটির একটি সহজ উদাহরণ দেখাব।

Observer Design Pattern এর উদাহরণ:

import java.util.Observable;
import java.util.Observer;

// ConcreteObserver
class TemperatureDisplay implements Observer {
    private String name;

    public TemperatureDisplay(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof TemperatureSensor) {
            System.out.println(name + " Display: Temperature updated to " + arg + " degrees.");
        }
    }
}

// ConcreteSubject
class TemperatureSensor extends Observable {
    private int temperature;

    public void setTemperature(int temperature) {
        this.temperature = temperature;
        setChanged();  // Marks the observable as changed
        notifyObservers(temperature);  // Notifies all registered observers with the updated temperature
    }

    public int getTemperature() {
        return temperature;
    }
}

public class ObserverPatternExample {
    public static void main(String[] args) {
        // Creating subject
        TemperatureSensor sensor = new TemperatureSensor();

        // Creating observers
        TemperatureDisplay display1 = new TemperatureDisplay("Main");
        TemperatureDisplay display2 = new TemperatureDisplay("Side");

        // Registering observers
        sensor.addObserver(display1);
        sensor.addObserver(display2);

        // Changing the temperature, which will notify observers
        sensor.setTemperature(25);
        sensor.setTemperature(30);
    }
}

Output:

Main Display: Temperature updated to 25 degrees.
Side Display: Temperature updated to 25 degrees.
Main Display: Temperature updated to 30 degrees.
Side Display: Temperature updated to 30 degrees.

ব্যাখ্যা:

  1. TemperatureSensor: এটি ConcreteSubject, যার মধ্যে তাপমাত্রার মান রয়েছে এবং যখন তাপমাত্রা পরিবর্তিত হয়, এটি notifyObservers() মেথডের মাধ্যমে সমস্ত অবজারভারকে অবহিত করে।
  2. TemperatureDisplay: এটি ConcreteObserver, যা তাপমাত্রার পরিবর্তনের জন্য update() মেথডটি ইমপ্লিমেন্ট করে। যখন তাপমাত্রা পরিবর্তিত হয়, এটি আপডেট নেয় এবং নতুন তাপমাত্রা দেখায়।
  3. addObserver(): এই মেথডের মাধ্যমে অবজারভারকে সাবস্ক্রাইব করা হয়।
  4. setChanged(): এটি ইন্ডিকেট করে যে অবজারভেবল (subject) এর অবস্থা পরিবর্তিত হয়েছে এবং অবজারভারদের অবহিত করার জন্য প্রস্তুত।
  5. notifyObservers(): এটি সকল অবজারভারকে অবহিত করার জন্য ব্যবহার করা হয়।

Observer Design Pattern এর সুবিধা:

  1. Loose Coupling: অবজারভেবল এবং অবজারভারদের মধ্যে শক্তিশালী সংযোগ নেই। Observer ক্লাসগুলি সিস্টেমের বিভিন্ন অংশে পৃথকভাবে কাজ করতে পারে এবং একে অপরের পরিবর্তন সম্পর্কে জানায়।
  2. Dynamic Updates: যখনই অবজারভেবল (subject) এর অবস্থা পরিবর্তিত হয়, তখন সমস্ত অবজারভাররা তা অবহিত হয়। এটি ডায়নামিকভাবে তথ্য আপডেট করতে সাহায্য করে।
  3. Multiple Observers: একটি অবজারভেবল একাধিক অবজারভারকে আপডেট পাঠাতে সক্ষম, যা একাধিক ডিভাইসে বা অ্যাপ্লিকেশনে ডেটা সিঙ্ক্রোনাইজ করতে সহায়তা করে।

Observer Design Pattern এর সীমাবদ্ধতা:

  1. Performance Issues: যদি বেশিরভাগ অবজারভারের সংখ্যা বেশি হয়, তবে notifyObservers() মেথডটি অনেক সময় নষ্ট করতে পারে, কারণ এটি প্রত্যেকটি অবজারভারের update() মেথড কল করে।
  2. Complexity: কিছু অ্যাপ্লিকেশনে যখন অনেক অবজারভারের প্রয়োজন হয়, তখন এই প্যাটার্নের কোড কিছুটা জটিল হতে পারে।

Java 9+ - Modern Observer Alternatives:

যেহেতু Observable এবং Observer ক্লাসগুলো Java 9 থেকে deprecated হয়ে গেছে, তাই এই প্যাটার্নটি আধুনিকভাবে বাস্তবায়ন করতে java.beans প্যাকেজের PropertyChangeListener, ReactiveX (RxJava), বা Streams API এর মতো আধুনিক পদ্ধতি ব্যবহার করা যেতে পারে।


Observer Design Pattern হল একটি খুবই কার্যকরী ডিজাইন প্যাটার্ন যা একাধিক অবজারভারের মাধ্যমে অবজারভেবলের পরিবর্তনগুলি ছড়িয়ে দেয়। এটি event-driven programming এ ব্যাপকভাবে ব্যবহৃত হয়। Java-তে এটি Observable এবং Observer ক্লাসের মাধ্যমে ইমপ্লিমেন্ট করা হয়, তবে আধুনিক Java সংস্করণে নতুন পদ্ধতিগুলো ব্যবহার করা হচ্ছে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...