设计模式深度解析:观察者模式(Observer Pattern)及其应用实践

267 阅读2分钟

设计模式深度解析:观察者模式(Observer Pattern)及其应用实践

什么是观察者模式?

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象(主题)的状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。这种模式常用于实现事件处理系统。

核心角色

  1. Subject(主题):维护一个观察者列表,提供添加、删除和通知观察者的方法。
  2. Observer(观察者):定义一个更新接口,用于接收主题的通知。
  3. ConcreteSubject(具体主题):实现主题接口,存储具体状态,并在状态改变时通知观察者。
  4. ConcreteObserver(具体观察者):实现观察者接口,定义具体的更新逻辑。

代码示例

Java 实现

import java.util.ArrayList;
import java.util.List;

// 观察者接口
interface Observer {
    void update(String message);
}

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题:新闻发布系统
class NewsPublisher implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String latestNews;

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(latestNews);
        }
    }

    public void setLatestNews(String news) {
        this.latestNews = news;
        notifyObservers();
    }
}

// 具体观察者:新闻订阅者
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 ObserverPatternDemo {
    public static void main(String[] args) {
        NewsPublisher publisher = new NewsPublisher();
        Observer subscriber1 = new NewsSubscriber("用户A");
        Observer subscriber2 = new NewsSubscriber("用户B");

        publisher.registerObserver(subscriber1);
        publisher.registerObserver(subscriber2);

        publisher.setLatestNews("Java 17 正式发布!");
    }
}

应用场景:电商价格变动通知

假设有一个电商平台,用户可以订阅某个商品的价格变动通知。当商品价格发生变化时,所有订阅该商品的用户都会收到通知。

实现思路

  1. 主题:商品类,维护订阅该商品的用户列表。
  2. 观察者:用户类,实现价格变动的通知逻辑。
  3. 触发通知:商品价格变动时,调用通知方法。

总结

观察者模式通过解耦主题和观察者,实现了灵活的事件通知机制。它适用于需要动态管理依赖关系的场景,如GUI事件处理、消息队列等。