行为型模式-1.观察者模式(Observer Pattern)

 2024-07-29    0 条评论    63 浏览

设计模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这个模式常常用于实现发布-订阅机制。

观察者模式的组成部分:

  1. Subject(被观察者):维护一系列观察者,并提供添加和删除观察者的方法。
  2. Observer(观察者):定义一个更新接口,以便在被观察者状态改变时得到通知。
  3. ConcreteSubject(具体被观察者):实现被观察者接口,状态发生改变时通知所有观察者。
  4. ConcreteObserver(具体观察者):实现观察者接口,更新自身的状态以反映被观察者的变化。

JDK中的应用

在JDK中,观察者模式被广泛应用于事件监听机制,比如 Swing 和 AWT 中的事件处理。java.util.Observerjava.util.Observable 类是 JDK 中内置的观察者模式实现。不过需要注意的是,从 Java 9 开始,这两个类被标记为过时。推荐使用其他实现方式,如使用事件监听器。

示例代码

下面是一个简单的观察者模式的实现示例:

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

// 被观察者接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

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

// 具体被观察者
class NewsAgency implements Subject {
    private List<Observer> observers;
    private String news;

    public NewsAgency() {
        observers = new ArrayList<>();
    }

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

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

// 具体观察者
class NewsChannel implements Observer {
    private String channelName;

    public NewsChannel(String channelName) {
        this.channelName = channelName;
    }

    @Override
    public void update(String message) {
        System.out.println(channelName + " received news: " + message);
    }
}

// 测试观察者模式
public class ObserverPatternExample {
    public static void main(String[] args) {
        NewsAgency newsAgency = new NewsAgency();

        NewsChannel channel1 = new NewsChannel("Channel 1");
        NewsChannel channel2 = new NewsChannel("Channel 2");

        newsAgency.registerObserver(channel1);
        newsAgency.registerObserver(channel2);

        newsAgency.setNews("Breaking News: Observer Pattern in Action!");
        newsAgency.setNews("New Java Features Released!");
    }
}

代码解析

  1. Subject 接口:定义了注册、删除和通知观察者的方法。
  2. Observer 接口:定义了一个 update 方法,用于更新观察者的状态。
  3. NewsAgency 类:实现了 Subject 接口,维护了一个观察者列表,并在新闻更新时通知所有观察者。
  4. NewsChannel 类:实现了 Observer 接口,接收来自 NewsAgency 的消息并打印出来。
  5. ObserverPatternExample 类:创建了一个 NewsAgency 和两个 NewsChannel,注册观察者并模拟新闻更新。

总结

观察者模式在很多地方都能找到应用,尤其是在需要实现组件之间解耦的场景中。尽管 JDK 中的 ObservableObserver 类被标记为过时,理解观察者模式的原理依然可以帮助我们在设计更灵活的系统时做出更好的选择。