观察者模式在软件设计的23种经典模式中相对较为直观和简单。它构建了一种机制,使得当某个对象的状态发生变化时,所有依赖这个对象的“观察者”都能自动得到通知并作出相应更新。
一、什么是观察者模式
观察者模式(或称为发布-订阅模式)允许多个对象(观察者)同时监听某个对象(被观察者)的状态。一旦被观察者的状态发生变化,所有注册的观察者都会自动收到通知,并据此更新自己的状态或执行相应的操作。
二、举例说明:小米14Ultra的发布
以小米14Ultra的新品发布为例,最近即将发布了,它肯定是会在京东卖,在淘宝卖,以及其他电商平台,这样京东、淘宝等都会密切关注这一事件,并在第一时间更新自己的商品信息。我们可以使用观察者模式来模拟这一过程。
首先,我们定义一个观察者接口:
public interface Observer {
void update(String message);
}
然后,我们定义被观察者(也就是主题),它有一个观察者列表,并且有一个方法来添加和移除观察者,还有一个方法用来通知所有观察者状态变化:
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
// 当有重要事件发生时,调用此方法
public void notifyObservers() {
notifyObservers("小米14已经发布,快来购买吧!");
}
}
现在,我们创建具体的观察者类,例如京东和淘宝:
public class JD implements Observer {
@Override
public void update(String message) {
System.out.println("京东平台收到消息:" + message);
// 京东平台自动更新小米14的商品信息
}
}
public class TaoBao implements Observer {
@Override
public void update(String message) {
System.out.println("淘宝平台收到消息:" + message);
// 淘宝平台自动更新小米14的商品信息
}
}
最后,我们创建一个场景类来模拟小米14的发布,并且通知各个观察者:
public class Xiaomi14Release {
public static void main(String[] args) {
Subject subject = new Subject();
Observer jd = new JD();
Observer taobao = new TaoBao();
subject.attach(jd);
subject.attach(taobao);
// 小米14发布,通知所有观察者
subject.notifyObservers();
// 假设一段时间后,小米14有促销活动,再次通知所有观察者
subject.notifyObservers("小米14限时促销活动开始了!");
// 假设京东不再关注小米14的信息,可以取消订阅
subject.detach(jd);
// 再次通知,这次京东不会收到消息了
subject.notifyObservers("小米14最后清仓!");
}
}
当运行上述代码时,可以看到控制台输出:
京东平台收到消息:小米14已经发布,快来购买吧!淘宝平台收到消息:小米14已经发布,快来购买吧!
京东平台收到消息:小米14限时促销活动开始了!
淘宝平台收到消息:小米14限时促销活动开始了!
淘宝平台收到消息:小米14最后清仓!
这个例子展示了观察者模式如何在小米14发布时,让各大电商平台自动获取通知并作出相应更新。当京东不再关注时,它就不会再收到任何更新消息了。
在软件开发领域,设计模式是解决常见问题的最佳实践。它们提供了一种标准化的方法,使得开发者能够高效地编写可维护、可扩展的代码。观察者模式就是其中的一种,它允许一个对象(被观察者)的状态变化时,自动通知所有依赖它的对象(观察者)。