大佬们好!我是LKJ_Coding,一枚初级马牛,正在努力在代码的丛林中找寻自己的方向。如果你也曾在调试中迷失,或是在文档中翻滚,那我们一定有许多共同话题可以聊!今天,我带着满满的代码“干货”来和大家分享,学不学无所谓,反正我先吐槽了!

概述:观察者模式的基本概念

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象间的一种一对多依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象(观察者)都会自动收到通知并进行更新。观察者模式的主要目的是解耦,允许观察者动态地订阅或取消订阅主题(Subject)的变化。

观察者模式的关键组成部分:

  1. 主题(Subject):持有状态并且向观察者发送通知的对象。它通常会维护一个观察者列表,提供方法来注册、移除观察者。
  2. 观察者(Observer):在主题的状态变化时接收通知的对象。观察者需要实现一个接口,当主题的状态发生变化时,它们会被通知并做出相应的更新。
  3. 通知机制:主题对象通过某种方式(例如回调或事件机制)通知观察者状态变化。

观察者模式通常用于需要多个对象根据一个对象的状态变化进行响应的场景,如事件处理、消息通知、UI 更新等。

定义主题(Subject)和观察者(Observer):通过注册和通知观察者来更新状态

步骤 1:定义观察者接口

首先,定义一个 Observer 接口,它包含一个 update 方法,用于接收主题的状态更新。

public interface Observer {void update(String message);  // 接收主题通知的方法
}

步骤 2:定义主题接口

定义一个 Subject 接口,主题需要提供方法来注册、移除观察者,并通知观察者。

public interface Subject {void registerObserver(Observer observer);  // 注册观察者void removeObserver(Observer observer);  // 移除观察者void notifyObservers();  // 通知所有观察者
}

步骤 3:创建具体主题类

实现 Subject 接口的具体类,维护一个观察者列表,并在状态变化时通知所有观察者。

import java.util.ArrayList;
import java.util.List;public class NewsAgency implements Subject {private List<Observer> observers;private String news;public NewsAgency() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);  // 注册观察者}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);  // 移除观察者}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(news);  // 通知所有观察者}}public void setNews(String news) {this.news = news;notifyObservers();  // 当新闻更新时,通知所有观察者}
}

NewsAgency 类中,我们维护了一个 observers 列表,存储所有注册的观察者。当新闻更新时,调用 notifyObservers 方法通知所有观察者。

步骤 4:创建具体观察者类

实现 Observer 接口的具体观察者类,更新主题状态时执行相应的操作。

public class NewsChannel implements Observer {private String name;public NewsChannel(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received news: " + message);  // 更新新闻}
}

NewsChannel 类中,我们实现了 update 方法,当收到主题通知时,输出接收到的新闻内容。

步骤 5:在客户端中使用观察者模式

在客户端中,我们创建主题(NewsAgency)和观察者(NewsChannel)对象,注册观察者并观察主题的变化。

public class Client {public static void main(String[] args) {// 创建主题NewsAgency newsAgency = new NewsAgency();// 创建观察者NewsChannel cnn = new NewsChannel("CNN");NewsChannel bbc = new NewsChannel("BBC");// 注册观察者newsAgency.registerObserver(cnn);newsAgency.registerObserver(bbc);// 设置新闻,通知观察者newsAgency.setNews("Breaking News: New Java version released!");// 移除一个观察者newsAgency.removeObserver(cnn);// 设置新闻,通知剩余的观察者newsAgency.setNews("Breaking News: Java 18 features announced!");}
}

运行结果:

CNN received news: Breaking News: New Java version released!
BBC received news: Breaking News: New Java version released!
BBC received news: Java 18 features announced!

代码示例:使用 Java 实现观察者模式

以下是完整的实现代码,包括主题、观察者、新闻发布逻辑等。

1. 观察者接口 Observer

public interface Observer {void update(String message);  // 接收通知的方法
}

2. 主题接口 Subject

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

3. 具体主题类 NewsAgency

import java.util.ArrayList;
import java.util.List;public class NewsAgency implements Subject {private List<Observer> observers;private String news;public NewsAgency() {observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);  // 注册观察者}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);  // 移除观察者}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(news);  // 通知所有观察者}}public void setNews(String news) {this.news = news;notifyObservers();  // 当新闻更新时,通知观察者}
}

4. 具体观察者类 NewsChannel

public class NewsChannel implements Observer {private String name;public NewsChannel(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received news: " + message);}
}

5. 客户端 Client

public class Client {public static void main(String[] args) {// 创建主题NewsAgency newsAgency = new NewsAgency();// 创建观察者NewsChannel cnn = new NewsChannel("CNN");NewsChannel bbc = new NewsChannel("BBC");// 注册观察者newsAgency.registerObserver(cnn);newsAgency.registerObserver(bbc);// 设置新闻,通知观察者newsAgency.setNews("Breaking News: New Java version released!");// 移除一个观察者newsAgency.removeObserver(cnn);// 设置新闻,通知剩余的观察者newsAgency.setNews("Breaking News: Java 18 features announced!");}
}

小结

观察者模式是一种常见的设计模式,它能够帮助我们在多个对象之间建立一种一对多的依赖关系。通过使用观察者模式,当主题的状态发生变化时,所有的观察者都会自动收到通知并作出相应的响应。使用 Java 实现观察者模式时,我们可以通过定义主题和观察者接口,分别实现具体的主题和观察者类来实现该模式。观察者模式广泛应用于事件驱动的系统中,如 GUI 事件处理、消息通知系统等。

好啦,废话不多说,今天的分享就到这里!如果你觉得我这“初级马牛”还挺有趣,那就请给我点个赞、留个言、再三连击三连哦!让我们一起“成精”吧!下次见,不见不散!