Observer Pattern হল একটি Behavioral Design Pattern যা একাধিক অবজারভার (observers) বা সদস্যকে একটি অবজেক্টের (subject) অবস্থা পরিবর্তন সম্পর্কে অবহিত করার জন্য ব্যবহৃত হয়। যখন একটি অবজেক্টের অবস্থা পরিবর্তিত হয়, তখন সেই পরিবর্তন সকল অবজারভারদের জানিয়ে দেওয়া হয়। এটি one-to-many dependency সম্পর্ক তৈরি করে, যেখানে একটি অবজেক্টের পরিবর্তন অন্যান্য একাধিক অবজেক্টকে প্রভাবিত করে।
এটি সাধারণত ব্যবহার করা হয় এমন সিস্টেমে যেখানে একটি অবজেক্টের পরিবর্তন বা ঘটনাটি (event) অন্যান্য অবজেক্টগুলির উপর সরাসরি প্রভাব ফেলে, যেমন UI updates, event-driven systems, model-view-controller (MVC) ডিজাইন, ইত্যাদি।
1. Observer Pattern এর বৈশিষ্ট্য
- One-to-many Dependency: একেকটি সিস্টেমের Subject (বা Observable) হতে পারে একাধিক Observers বা পর্যবেক্ষক। যখন Subject এর অবস্থা পরিবর্তিত হয়, তখন সেটি সমস্ত Observers কে অবহিত করে।
- Loose Coupling: Observer এবং Subject একে অপরের থেকে আলাদা থাকে এবং তাদের মধ্যে খুব কম সম্পর্ক থাকে। Subject এর অবস্থা পরিবর্তন হলেও, Observer এর কাজ আগের মতো থাকে।
- Dynamic Subscription: Observer Pattern এ Observer গুলো ডায়নামিকভাবে Subject এর সাথে যুক্ত বা বিচ্ছিন্ন হতে পারে।
2. Observer Pattern এর ব্যবহারের ক্ষেত্র
- Event handling systems: GUI (Graphical User Interface) অ্যাপ্লিকেশন যেমন: Swing, JavaFX বা Android UI, যেখানে ইউজারের ক্রিয়া (event) এর উপর ভিত্তি করে ডাটা আপডেট করা হয়।
- Model-View-Controller (MVC): UI এর পরিবর্তন সম্পর্কে Model কে অবহিত করা, বা vice versa।
- Real-time applications: যেমন একাধিক ক্লায়েন্টের জন্য আপডেট বার্তা পাঠানো (live feeds, notifications)।
- State Change Notification: একটি অবজেক্টের স্টেট পরিবর্তনের সাথে সাথে অন্য অবজেক্টদের তা জানানো।
3. Observer Pattern এর স্ট্রাকচার
Observer Pattern এর স্ট্রাকচার সাধারণত তিনটি প্রধান উপাদান থেকে গঠিত হয়:
- Subject (Observable): এটি সেই অবজেক্ট যা তার অবস্থা পরিবর্তন ঘটায় এবং Observer গুলোকে আপডেট করার জন্য প্রস্তুত থাকে।
- Observer: এটি সেই অবজেক্ট যা Subject থেকে বার্তা পেয়ে তার অবস্থান আপডেট করে।
- ConcreteSubject: এটি Subject এর বাস্তবায়ন, যেখানে অবস্থা পরিবর্তন ঘটায়।
- ConcreteObserver: এটি Observer এর বাস্তবায়ন, যা Subject এর পরিবর্তনের উপর ভিত্তি করে নিজেকে আপডেট করে।
4. Observer Pattern এর উদাহরণ
ধরা যাক, একটি সিস্টেমে একটি WeatherStation ক্লাস আছে যা অবস্থা পরিবর্তন করলে সব Display (Observers) কে তথ্য প্রদান করবে। এখানে WeatherStation হল Subject, এবং বিভিন্ন ডিসপ্লে ইউনিট (যেমন PhoneDisplay, LCDDisplay) হল Observer।
Observer Pattern এর কোড উদাহরণ:
import java.util.ArrayList;
import java.util.List;
// Observer Interface
interface Observer {
void update(float temperature, float humidity, float pressure);
}
// Subject Interface
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// Concrete Subject
class WeatherStation implements Subject {
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
public WeatherStation() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(temperature, humidity, pressure);
}
}
public void setWeatherData(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObservers(); // Notify all observers when data changes
}
}
// Concrete Observer 1
class PhoneDisplay implements Observer {
@Override
public void update(float temperature, float humidity, float pressure) {
System.out.println("Phone Display: Weather Update -> Temperature: " + temperature
+ ", Humidity: " + humidity + ", Pressure: " + pressure);
}
}
// Concrete Observer 2
class LCDDisplay implements Observer {
@Override
public void update(float temperature, float humidity, float pressure) {
System.out.println("LCD Display: Weather Update -> Temperature: " + temperature
+ ", Humidity: " + humidity + ", Pressure: " + pressure);
}
}
public class Main {
public static void main(String[] args) {
// Create WeatherStation (Subject)
WeatherStation weatherStation = new WeatherStation();
// Create observers
PhoneDisplay phoneDisplay = new PhoneDisplay();
LCDDisplay lcdDisplay = new LCDDisplay();
// Register observers to WeatherStation
weatherStation.registerObserver(phoneDisplay);
weatherStation.registerObserver(lcdDisplay);
// Simulate weather data change and notify observers
weatherStation.setWeatherData(30.4f, 65f, 1013f); // Data update and notify
System.out.println();
// Unregister one observer and update again
weatherStation.removeObserver(phoneDisplay);
weatherStation.setWeatherData(28.2f, 70f, 1012f); // Data update and notify
}
}
Output:
Phone Display: Weather Update -> Temperature: 30.4, Humidity: 65.0, Pressure: 1013.0
LCD Display: Weather Update -> Temperature: 30.4, Humidity: 65.0, Pressure: 1013.0
LCD Display: Weather Update -> Temperature: 28.2, Humidity: 70.0, Pressure: 1012.0
ব্যাখ্যা:
- WeatherStation (Subject) যখন setWeatherData() মেথডে নতুন ডেটা সেট করে, তখন এটি তার সকল নিবন্ধিত Observer (যেমন:
PhoneDisplayএবংLCDDisplay) কে notifyObservers() মেথডের মাধ্যমে অবহিত করে। - PhoneDisplay এবং LCDDisplay (Concrete Observers) তাদের
update()মেথডের মাধ্যমে নতুন ডেটা পায় এবং তা প্রদর্শন করে। - একটি Observer (
PhoneDisplay) কে removeObserver() মেথড দিয়ে রিমুভ করার পর, পরবর্তী ডেটা পরিবর্তনের সময় তা আপডেট পায় না।
5. Observer Pattern এর সুবিধা ও অসুবিধা
সুবিধা:
- Loose Coupling: Observer Pattern ক্লায়েন্ট এবং সাবজেক্টের মধ্যে স্বল্প সম্পর্ক রাখে। একটি সাবজেক্টে পরিবর্তন হলে তার কোনো প্রভাব Observer গুলিতে হয়, তবে তারা একে অপরের সাথে সরাসরি যোগাযোগ করে না।
- Dynamic Subscription: অবজারভাররা ডায়নামিকভাবে সাবজেক্টের সাথে যুক্ত বা বিচ্ছিন্ন হতে পারে।
- Reusability: একটি Observer pattern implementation একাধিক প্রসঙ্গে পুনরায় ব্যবহার করা যায়, যা সফটওয়্যার সিস্টেমের নমনীয়তা এবং রিইউজেবল কোড তৈরি করে।
অসুবিধা:
- Memory Leaks: যদি Observer গুলি সাবজেক্ট থেকে বিচ্ছিন্ন না হয়, তবে এটি memory leak সৃষ্টি করতে পারে, কারণ সাবজেক্ট তাদের রেফারেন্স ধরে রাখে।
- Complexity: অনেক Observer হলে সিস্টেম জটিল হতে পারে এবং Observer গুলির অনেকবার আপডেট হওয়া সফটওয়্যারের কর্মক্ষমতা কমিয়ে দিতে পারে।
- Notification Overhead: অনেক Observer থাকলে একসাথে অনেক নোটিফিকেশন পাঠানো যেতে পারে, যা সিস্টেমের পারফরম্যান্সে প্রভাব ফেলতে পারে।
Observer Pattern হল একটি শক্তিশালী ডিজাইন প্যাটার্ন যা ক্লায়েন্ট এবং সাবজেক্টের মধ্যে লুজ কপ্লিং (Loose Coupling) তৈরি করে এবং একাধিক অবজারভারদের মধ্যে অবস্থা পরিবর্তনের বার্তা প্রেরণ করার জন্য ব্যবহৃত হয়। এটি এমন সিস্টেমে খুবই কার্যকরী যেখানে অনেক অবজারভার একই সময়ে পরিবর্তন বা আপডেট পেতে চায়, যেমন গেম ডেভেলপমেন্ট, UI অ্যাপ্লিকেশন এবং রিয়েল-টাইম সিস্টেম।
Java তে Observer Pattern বাস্তবায়ন সহজ এবং শক্তিশালী। এটি ডিজাইন প্যাটার্নের মধ্যে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে এবং সিস্টেমের ফ্লেক্সিবিলিটি এবং স্কেলেবিলিটি বৃদ্ধি করে।
Read more