返回

揭秘观察者模式:实时知晓对象状态,赋能你的代码!

见解分享

在设计模式的世界中,观察者模式扮演着至关重要的角色。它赋予你的代码非凡的能力:实时知晓对象状态的改变,确保相关对象始终掌握最新信息。

理解观察者模式

想象这样一个场景:你正焦急地等待咖啡煮好,不断地查看咖啡壶。观察者模式正是如此:它允许一个对象(称为被观察者)通知其他对象(称为观察者)状态的改变。观察者就像等待咖啡的人,时刻关注着被观察者(咖啡壶)的变化,一旦咖啡煮好(状态改变),观察者便会收到通知。

应用场景

观察者模式广泛应用于各种领域:

  • GUI事件监听: 按钮点击、菜单选择等事件触发时,观察者(事件监听器)会被通知并做出相应响应。
  • 数据变更通知: 当数据库中的记录被更新时,观察者(其他依赖该数据的程序)会被通知,从而更新其自身状态。
  • 消息发布/订阅: 发布者(被观察者)发布消息,而订阅者(观察者)接收并处理这些消息。

Java中的观察者模式

Java为观察者模式提供了内置支持。

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

public class Observable {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this, null);
        }
    }
}

使用观察者模式

  1. 创建被观察者类,继承Observable
  2. 创建观察者类,实现Observer接口。
  3. 被观察者注册观察者,通过addObserver方法。
  4. 被观察者状态改变时,调用notifyObservers方法通知观察者。
  5. 观察者在update方法中处理通知。

优势

  • 松散耦合: 观察者和被观察者彼此独立,无需直接相互依赖。
  • 可扩展性: 易于添加或移除观察者,无需修改现有代码。
  • 异步通知: 观察者可以异步处理通知,避免阻塞被观察者。

示例

假设有一个新闻网站,读者可以订阅特定的新闻类别。当新新闻发布时,订阅了该类别的读者会收到通知。

class NewsPublisher extends Observable {
    private List<News> news;

    public void publishNews(News news) {
        this.news.add(news);
        setChanged();
        notifyObservers();
    }
}

class NewsSubscriber implements Observer {
    private String category;

    public NewsSubscriber(String category) {
        this.category = category;
    }

    @Override
    public void update(Observable o, Object arg) {
        NewsPublisher publisher = (NewsPublisher) o;
        for (News news : publisher.getNews()) {
            if (news.getCategory().equals(category)) {
                System.out.println("New news published: " + news.getTitle());
            }
        }
    }
}

总结

观察者模式为你的代码提供了一种高效的方式来通知对象状态的变化。它增强了可扩展性、松散耦合和异步通信的能力,是现代软件开发中必不可少的工具。