當涉及到電商場景時,觀察者模式可以用于處理多種情況,比如訂單狀態更新、庫存變化、用戶積分變化等。下面是一個簡化的訂單狀態更新的觀察者模式案例。
1.首先,定義一個主題接口 OrderSubject
/*** Description:主題,用于管理觀察者** @author: wubei* @date: 2023/12/6 14:09*/
public interface OrderSubject {void addObserver(OrderObserver observer);void removeObserver(OrderObserver observer);void notifyObservers(OrderStatus status);}
2.然后,定義一個觀察者接口 OrderObserver
/*** Description:** @author: wubei* @date: 2023/12/6 14:09*/
public interface OrderObserver {void update(OrderStatus status);}
3.接下來,定義訂單狀態枚舉 OrderStatus
/*** Description:** @author: wubei* @date: 2023/12/6 14:10*/
public enum OrderStatus {CREATED, SHIPPED, DELIVERED, CANCELLED}
4.然后,實現具體的訂單主題類 Order
/*** Description:* Order 類充當主題(Subject),而 CustomerService 和 Warehouse 類充當觀察者(Observer)。* 當訂單狀態發生變化時,所有注冊的觀察者都會收到通知,并執行相應的更新邏輯。* 這個模式可以輕松擴展以處理更多的觀察者和主題。** @author: wubei* @date: 2023/12/6 14:10*/
public class Order implements OrderSubject {private List<OrderObserver> observers = new ArrayList<>();private OrderStatus status;public Order(OrderStatus status) {this.status = status;}public OrderStatus getStatus() {return status;}public void setStatus(OrderStatus status) {this.status = status;notifyObservers(status);}@Overridepublic void addObserver(OrderObserver observer) {observers.add(observer);}@Overridepublic void removeObserver(OrderObserver observer) {observers.remove(observer);}@Overridepublic void notifyObservers(OrderStatus status) {for (OrderObserver observer : observers) {observer.update(status);}}
}
5.接下來,創建兩個具體的觀察者類,分別處理訂單狀態的更新
/*** Description:** @author: wubei* @date: 2023/12/6 14:10*/
@Slf4j
public class CustomerService implements OrderObserver {@Overridepublic void update(OrderStatus status) {log.info("訂單狀態發生改變處理CustomerService邏輯,status={},", status);// 具體的處理邏輯,例如發送郵件通知客戶}
}
/*** Description:** @author: wubei* @date: 2023/12/6 14:10*/
@Slf4j
public class Warehouse implements OrderObserver {@Overridepublic void update(OrderStatus status) {log.info("訂單狀態發生改變處理Warehouse邏輯,status={},", status);// 具體的處理邏輯,例如更新庫存}}
6.最后,在主應用程序中使用這些類
public class Main {public static void main(String[] args) {Order order = new Order(OrderStatus.CREATED);// 創建觀察者OrderObserver customerService = new CustomerService();OrderObserver warehouse = new Warehouse();// 注冊觀察者order.addObserver(customerService);order.addObserver(warehouse);// 模擬訂單狀態變化order.setStatus(OrderStatus.SHIPPED);order.setStatus(OrderStatus.DELIVERED);}
}
執行結果:
14:49:40.081 [main] INFO com.ft.beanPostProcessor.custom1.CustomerService - 訂單狀態發生改變處理CustomerService邏輯,status=SHIPPED,
14:49:40.082 [main] INFO com.ft.beanPostProcessor.custom1.Warehouse - 訂單狀態發生改變處理Warehouse邏輯,status=SHIPPED,
14:49:40.082 [main] INFO com.ft.beanPostProcessor.custom1.CustomerService - 訂單狀態發生改變處理CustomerService邏輯,status=DELIVERED,
14:49:40.082 [main] INFO com.ft.beanPostProcessor.custom1.Warehouse - 訂單狀態發生改變處理Warehouse邏輯,status=DELIVERED,