观察者设计模式(Observer
Pattern)是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。这种模式非常适用于实现分布式事件处理系统、消息发布/订阅系统等。
观察者模式的主要角色
- 主题(Subject):又称为“被观察者”,它维护一组观察者,提供用于注册和删除观察者对象的接口。
- 观察者(Observer):为那些在主题状态发生改变时需获得通知的对象定义一个更新接口。
- 具体主题(Concrete Subject):状态发生改变时,向它的观察者发出通知;存储具体观察者对象,实现抽象主题(Subject)的接口。
- 具体观察者(Concrete Observer):实现观察者所要求的更新接口,以便使本身的状态与主题的状态相协调。
观察者模式的工作原理
当主题对象的状态发生变化时,主题对象会遍历注册到它上面的所有观察者,并调用观察者的更新方法,以通知所有观察者状态已经改变。观察者在得到状态更新的通知后,可以相应地更新自己的状态或执行相应的操作。
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
// 观察者接口
interface Observer {
void update(String message);
}
// 具体主题
class NewsAgency implements Subject {
private List<Observer> observers = new ArrayList<>();
private String news;
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(news);
}
}
public void setNews(String news) {
this.news = news;
notifyObservers();
}
}
// 具体观察者
class NewsChannel implements Observer {
private String news;
@Override
public void update(String news) {
this.news = news;
System.out.println("NewsChannel got news: " + news);
}
}
public class ObserverPatternDemo {
public static void main(String[] args) {
NewsAgency newsAgency = new NewsAgency();
NewsChannel newsChannel = new NewsChannel();
newsAgency.registerObserver(newsChannel);
newsAgency.setNews("Breaking News: Observer Pattern in Java!");
}
}
NewsAgency是一个具体的主题,它通知所有注册的观察者(如NewsChannel)状态改变(新闻更新)的消息。当NewsAgency发布新闻时,所有订阅的NewsChannel都会收到通知并进行相应的更新操作。