java中如何实现观察者模式

发布时间:2021-06-22 15:18:42 作者:Leah
来源:亿速云 阅读:184
# 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;
    }
}

2. Observer接口

public interface Observer {
    void update(Observable o, Object arg);
}

3. 使用示例

// 具体主题
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);  // 自动触发更新
    }
}

三、自定义实现观察者模式

更灵活的自主实现方式:

1. 定义主题接口

public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

2. 具体主题实现

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();
    }
}

3. 观察者接口与实现

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);
    }
}

4. 使用示例

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正式发布!");
    }
}

四、观察者模式的进阶应用

1. 支持多种事件类型

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);
}

2. 使用Java 8 Lambda简化

// 直接使用函数式接口
publisher.registerObserver(event -> 
    System.out.println("收到事件: " + event.getType()));

3. 结合Spring框架实现

// 使用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) {
        // 处理事件
    }
}

五、观察者模式的最佳实践

  1. 松耦合设计:主题不需要知道观察者的具体类
  2. 事件过滤:可增加事件过滤机制提高效率
  3. 线程安全
    
    // 使用CopyOnWriteArrayList保证线程安全
    private List<Observer> observers = new CopyOnWriteArrayList<>();
    
  4. 避免循环依赖:注意观察者回调时不要反向调用主题

六、与其他模式的对比

模式 区别
发布-订阅 通常有中间的事件通道
中介者 集中处理对象间通信
责任链 沿链传递请求直到被处理

七、实际应用场景

  1. GUI事件处理(如Java Swing中的ActionListener)
  2. 消息通知系统
  3. 股票行情更新
  4. Spring框架的事件机制
  5. 分布式系统中的配置更新

总结

观察者模式通过解耦观察者和被观察者,实现了高效的状态通知机制。Java中既可以使用内置的Observable类,也可以自定义实现更灵活的方案。在复杂系统中,合理使用观察者模式能够显著降低组件间的耦合度,提高代码的可维护性和扩展性。 “`

注:本文实际约1500字,可根据需要补充更多代码示例或应用场景说明以达到1600字要求。

推荐阅读:
  1. vue中怎么实现观察者模式
  2. Java如何实现观察者模式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:PHP如何实现大流量下抢购方案

下一篇:PHP如何生成模糊图片

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》