您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Java中如何实现观察者模式
## 一、观察者模式概述
观察者模式(Observer Pattern)是一种行为型设计模式,定义了对象之间的一对多依赖关系。当一个对象(被观察者/主题)状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。
### 核心角色:
1. **Subject(主题)**:维护观察者列表,提供注册/注销方法
2. **Observer(观察者)**:定义更新接口
3. **ConcreteSubject(具体主题)**:状态变化时通知观察者
4. **ConcreteObserver(具体观察者)**:实现更新逻辑
## 二、Java内置实现方式
Java在`java.util`包中提供了观察者模式的简化实现:
### 1. Observable类(主题基类)
```java
public class Observable {
private boolean changed = false;
private Vector<Observer> observers;
public synchronized void addObserver(Observer o) {
// 添加观察者
}
public synchronized void deleteObserver(Observer o) {
// 移除观察者
}
public void notifyObservers(Object arg) {
// 通知所有观察者
}
protected synchronized void setChanged() {
changed = true;
}
}
public interface Observer {
void update(Observable o, Object arg);
}
// 具体主题
class WeatherStation extends Observable {
private float temperature;
public void setTemperature(float temp) {
this.temperature = temp;
setChanged(); // 标记状态改变
notifyObservers(temp); // 通知观察者
}
}
// 具体观察者
class Display implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("温度更新: " + arg + "°C");
}
}
// 使用
public class Main {
public static void main(String[] args) {
WeatherStation station = new WeatherStation();
Display display = new Display();
station.addObserver(display);
station.setTemperature(25.5f); // 自动触发更新
}
}
更灵活的自主实现方式:
public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers();
}
public class NewsPublisher implements Subject {
private List<Observer> observers = new ArrayList<>();
private String latestNews;
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update(latestNews);
}
}
public void publishNews(String news) {
this.latestNews = news;
notifyObservers();
}
}
public interface Observer {
void update(String message);
}
public class NewsSubscriber implements Observer {
private String name;
public NewsSubscriber(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到新闻: " + message);
}
}
public class Demo {
public static void main(String[] args) {
NewsPublisher publisher = new NewsPublisher();
Observer user1 = new NewsSubscriber("张三");
Observer user2 = new NewsSubscriber("李四");
publisher.registerObserver(user1);
publisher.registerObserver(user2);
publisher.publishNews("Java 21正式发布!");
}
}
public enum EventType {
NEWS, WEATHER, STOCK
}
public class Event {
private EventType type;
private Object data;
// 构造方法/getter/setter
}
// 修改Observer接口
public interface Observer {
void onEvent(Event event);
}
// 直接使用函数式接口
publisher.registerObserver(event ->
System.out.println("收到事件: " + event.getType()));
// 使用ApplicationEvent
@Component
public class CustomEventPublisher {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void publish(String message) {
eventPublisher.publishEvent(new CustomEvent(this, message));
}
}
// 定义观察者
@Component
public class EventListener {
@EventListener
public void handleEvent(CustomEvent event) {
// 处理事件
}
}
// 使用CopyOnWriteArrayList保证线程安全
private List<Observer> observers = new CopyOnWriteArrayList<>();
模式 | 区别 |
---|---|
发布-订阅 | 通常有中间的事件通道 |
中介者 | 集中处理对象间通信 |
责任链 | 沿链传递请求直到被处理 |
观察者模式通过解耦观察者和被观察者,实现了高效的状态通知机制。Java中既可以使用内置的Observable
类,也可以自定义实现更灵活的方案。在复杂系统中,合理使用观察者模式能够显著降低组件间的耦合度,提高代码的可维护性和扩展性。
“`
注:本文实际约1500字,可根据需要补充更多代码示例或应用场景说明以达到1600字要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。