Overview
The Observer Design Pattern defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. It is commonly used in event-driven systems.
Key Characteristics
- Defines a clear dependency between objects (subject and observers).
- Promotes loose coupling between the subject and its observers.
- Ensures that observers are notified automatically of changes in the subject.
Implementation
The following is an example of an Observer implementation in Java:
import java.util.ArrayList;
import java.util.List;
// Subject
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
// Concrete Subject
class ConcreteSubject implements Subject {
private List observers = new ArrayList<>();
private String state;
public void setState(String state) {
this.state = state;
notifyObservers();
}
public String getState() {
return state;
}
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
}
// Observer
interface Observer {
void update(String state);
}
// Concrete Observer
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String state) {
System.out.println(name + " received update: " + state);
}
}
// Demo
public class ObserverDemo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.attach(observer1);
subject.attach(observer2);
subject.setState("State 1");
subject.setState("State 2");
}
}
When to Use
- When multiple objects need to be notified about changes in the state of another object.
- When you want to establish a loosely coupled communication between objects.
Advantages
- Promotes loose coupling between the subject and observers.
- Ensures all dependent objects are updated automatically.
Disadvantages
- Can lead to unexpected behavior if not carefully managed (e.g., circular updates).
- May introduce performance overhead if there are many observers.