在 Java 中,内置观察者模式主要体现在早期版本提供的
java.util.Observable(被观察者)和 java.util.Observer(观察者)接口上。
⚠️ 注意:
从 Java 9 开始,这两个类已被标记为@Deprecated,官方不再推荐使用,推荐改用PropertyChangeListener、Flow API或第三方方案(如 Guava、RxJava)。
但很多老代码、面试或学习设计模式时仍然会用到,所以理解它仍然有价值。
Observable(被观察者)void addObserver(Observer o) // 添加观察者
void deleteObserver(Observer o) // 删除观察者
void notifyObservers() // 通知所有观察者
void notifyObservers(Object arg)// 带参数的通知
void setChanged() // 标记状态已改变
Observer(观察者)void update(Observable o, Object arg)
import java.util.Observable;
public class NewsPublisher extends Observable {
private String news;
public void publishNews(String news) {
this.news = news;
setChanged(); // 必须调用,否则不会通知
notifyObservers(news); // 通知观察者
}
public String getNews() {
return news;
}
}
import java.util.Observable;
import java.util.Observer;
public class Reader implements Observer {
private String name;
public Reader(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof NewsPublisher) {
System.out.println(name + " 收到新闻: " + arg);
}
}
}
public class ObserverTest {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
Reader r1 = new Reader("张三");
Reader r2 = new Reader("李四");
publisher.addObserver(r1);
publisher.addObserver(r2);
publisher.publishNews("Java 9 发布了!");
}
}
张三 收到新闻: Java 9 发布了!
李四 收到新闻: Java 9 发布了!
ObservableObserversetChanged()notifyObservers()update() 被自动回调| 问题 | 说明 |
|---|---|
| 非线程安全 | Observable 内部未处理好并发 |
| 继承限制 | 必须继承 Observable,不支持组合 |
| API 设计老旧 | 不符合现代 Java 风格 |
| 不灵活 | 无法区分事件类型 |
PropertyChangeListener(JavaBeans 风格)PropertyChangeSupport support = new PropertyChangeSupport(this);
support.addPropertyChangeListener(evt -> { ... });
support.firePropertyChange("news", oldVal, newVal);
Flow API(响应式)Flow.Publisher
Flow.Subscriber
Java 内置观察者 = 继承
Observable+ 实现Observer+setChanged()+notifyObservers()
但已过时,实际项目中不推荐使用。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。