在观察者模式中,通常有以下角色:
1. 主题(Subject): 维护一组观察者对象,提供添加、删除观察者以及通知观察者的方法。
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
2. 具体主题(ConcreteSubject): 继承自主题,负责维护具体的状态,并在状态变化时通知观察者。
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
notifyObservers("State changed: " + state);
}
}
3. 观察者(Observer): 定义一个更新方法,用于接收主题的通知。
public interface Observer {
void update(String message);
}
4. 具体观察者(ConcreteObserver): 实现观察者接口,具体实现更新方法。
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
5. 客户端代码: 创建主题、观察者对象,并将观察者注册到主题,当主题状态变化时,观察者会收到通知。
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.setState("New State");
}
}
在这个例子中,具体主题(ConcreteSubject)维护了一个状态,并在状态变化时通知观察者。观察者(ConcreteObserver)接收到通知后执行相应的更新操作。观察者模式使得主题和观察者之间的关系松耦合,更容易扩展和维护。
转载请注明出处:http://www.pingtaimeng.com/article/detail/13956/设计模式