设计模式-观察者模式使用教程

小明 2025-05-08 20:01:39 6

观察者���式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象(称为“主题”或“可观察者”)的状态发生变化时,所有依赖于它的对象(称为“观察者”)都会被自动通知并更新。

()

观察者模式主要涉及两类对象:

  1. 可观察者(Observable,也称为主题Subject):它维护一组观察者,提供用于添加、移除以及通知观察者的方法。
  2. 观察者(Observer):它定义了接收来自可观察者通知的更新方法。

观察者模式允许可观察者在不了解观察者具体实现的情况下,发送通知给一组观察者,从而实现解耦。

()

实现观察者模式

下面是如何在Java中实现观察者模式的一个例子:

首先,定义观察者接口:

1public interface Observer {
2    void update(String message);
3}

然后,创建可观察者接口:

1public interface Observable {
2    void addObserver(Observer observer);
3    void removeObserver(Observer observer);
4    void notifyObservers(String message);
5}

实现可观察者类:

1import java.util.ArrayList;
2import java.util.List;
3
4public class NewsAgency implements Observable {
5    private List observers = new ArrayList();
6    private String news;
7
8    public void setNews(String news) {
9        this.news = news;
10        notifyObservers(news);
11    }
12
13    @Override
14    public void addObserver(Observer observer) {
15        observers.add(observer);
16    }
17
18    @Override
19    public void removeObserver(Observer observer) {
20        observers.remove(observer);
21    }
22
23    @Override
24    public void notifyObservers(String message) {
25        for (Observer observer : observers) {
26            observer.update(message);
27        }
28    }
29}

接着,实现一个具体的观察者类:

1public class NewsReader implements Observer {
2    private String name;
3
4    public NewsReader(String name) {
5        this.name = name;
6    }
7
8    @Override
9    public void update(String message) {
10        System.out.println(name + " received news: " + message);
11    }
12}

最后,展示如何使用这些类:

1public class Main {
2    public static void main(String[] args) {
3        NewsAgency newsAgency = new NewsAgency();
4
5        NewsReader reader1 = new NewsReader("Reader 1");
6        NewsReader reader2 = new NewsReader("Reader 2");
7
8        newsAgency.addObserver(reader1);
9        newsAgency.addObserver(reader2);
10
11        newsAgency.setNews("New article about Design Patterns!");
12
13        newsAgency.removeObserver(reader1);
14
15        newsAgency.setNews("Another article, only Reader 2 will receive this!");
16    }
17}

在上面的例子中,NewsAgency 类是可观察者,它保存了一个观察者列表并有方法来添加、移除和通知观察者。NewsReader 类实现了 Observer 接口,定义了如何接收更新的逻辑。当 NewsAgency 有新消息时,它会调用 notifyObservers() 方法,该方法依次调用每个观察者的 update() 方法,传递消息给他们。

The End
微信