观察者模式
1.什么是观察者模式?
观察者模式------它用于在对象之间建立一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都能够自动收到通知并进行相应的更新操作
2.业务场景
观察者模式实现:
1.一个被观察者的类Observerable ;
2.多个观察者Observer ;
3.观察者的差异化实现
在一个电商网站中,当用户下单成功后,需要通知仓库系统准备发货、通知物流系统安排配送、通知财务系统进行结算等等。这些不同的子系统都需要对订单状态进行监听,并在订单状态改变时做出相应的处理。
相应代码:
// 定义订单类
public class Order {
private String orderId;
private int status;
// 订单状态改变时通知所有观察者
public void setStatus(int status) {
this.status = status;
notifyObservers();
}
// 注册观察者
public void attachObserver(Observer observer) {
observers.add(observer);
}
// 移除观察者
public void detachObserver(Observer observer) {
observers.remove(observer);
}
// 通知所有观察者
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(this);
}
}
}
// 定义观察者接口
public interface Observer {
void update(Order order);
}
// 定义仓库系统类作为一个观察者
public class WarehouseSystem implements Observer {
@Override
public void update(Order order) {
if (order.getStatus() == 1) { // 如果订单状态为待发货,则准备发货
prepareDelivery(order.getOrderId());
}
}
// 准备发货逻辑
private void prepareDelivery(String orderId){
System.out.println("仓库系统:订单" + orderId + "已准备好发货");
}
}
// 定义物流系统类作为另一个观察者
public class LogisticsSystem implements Observer {
@Override
public void update(Order order) {
if (order.getStatus() == 2) { // 如果订单状态为待配送,则安排配送
arrangeDelivery(order.getOrderId());
}
}
// 安排配送逻辑
private void arrangeDelivery(String orderId){
System.out.println("物流系统:订单" + orderId + "已安排好配送");
}
}
解释:
Order 类表示订单对象,其中 attachObserver() 方法和 detachObserver() 方法用于注册和移除观察者,notifyObservers() 方法则会遍历所有已注册的观察者并调用其 update() 方法进行更新操作。
WarehouseSystem 和 LogisticsSystem 分别表示仓库和物流两个子系统,并实现了 Observer 接口以便被注册为 Order 对象的观察者。
当订单状态改变时,会自动调用各个子系统的 update() 方法进行相应的处理
通过使用观察者模式可以将复杂业务逻辑分解成多个独立且可扩展的组件,并且能够有效地降低各组件之间的耦合度