观察者模式(Observer Pattern)是一种行为设计模式,常用于实现发布/订阅机制。当一个对象状态发生改变时,它会通知依赖它的其他对象,使它们自动更新。以下是一个实际业务中的例子:一个简单的“订单状态更新通知系统”。
举例:业务场景
一个电商系统中,当订单状态发生变化时,系统需要通知用户和物流系统。使用观察者模式可以很好地解耦通知逻辑和订单状态的变化。
import java.util.ArrayList;
import java.util.List;
// 定义观察者接口
interface Observer {
void update(String orderId, String status);
}
// 具体观察者:用户
class UserObserver implements Observer {
private String name;
public UserObserver(String name) {
this.name = name;
}
@Override
public void update(String orderId, String status) {
System.out.println("用户 " + name + " 收到通知:订单 " + orderId + " 状态变更为:" + status);
}
}
// 具体观察者:物流系统
class LogisticsObserver implements Observer {
@Override
public void update(String orderId, String status) {
System.out.println("物流系统接收通知:订单 " + orderId + " 状态变更为:" + status);
if ("已发货".equals(status)) {
System.out.println("物流系统开始处理发货流程。");
}
}
}
// 被观察者:订单
class Order {
private String orderId;
private String status;
private List<Observer> observers = new ArrayList<>();
public Order(String orderId) {
this.orderId = orderId;
}
// 添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
// 移除观察者
public void removeObserver(Observer observer) {
observers.remove(observer);
}
// 设置状态并通知观察者
public void setStatus(String status) {
this.status = status;
System.out.println("订单 " + orderId + " 状态更新为:" + status);
notifyObservers();
}
// 通知所有观察者
private void notifyObservers() {
for (Observer observer : observers) {
observer.update(orderId, status);
}
}
}
// 测试代码
public class ObserverPatternDemo {
public static void main(String[] args) {
// 创建订单
Order order = new Order("12345");
// 创建观察者
UserObserver user = new UserObserver("张三");
LogisticsObserver logistics = new LogisticsObserver();
// 注册观察者
order.addObserver(user);
order.addObserver(logistics);
// 更新订单状态
order.setStatus("待支付");
order.setStatus("已支付");
order.setStatus("已发货");
}
}