设计模式之观察者模式(主题对象发生变化,通知各个观察者)

当涉及到电商场景时,观察者模式可以用于处理多种情况,比如订单状态更新、库存变化、用户积分变化等。下面是一个简化的订单状态更新的观察者模式案例。

1.首先,定义一个主题接口 OrderSubject

java 复制代码
/**
 * 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

java 复制代码
/**
 * Description:
 *
 * @author: wubei
 * @date: 2023/12/6 14:09
 */
public interface  OrderObserver {

    void update(OrderStatus status);

}

3.接下来,定义订单状态枚举 OrderStatus

java 复制代码
/**
 * Description:
 *
 * @author: wubei
 * @date: 2023/12/6 14:10
 */
public enum OrderStatus {

    CREATED, SHIPPED, DELIVERED, CANCELLED

}

4.然后,实现具体的订单主题类 Order

java 复制代码
/**
 * 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);
    }

    @Override
    public void addObserver(OrderObserver observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(OrderObserver observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(OrderStatus status) {
        for (OrderObserver observer : observers) {
            observer.update(status);
        }
    }
}

5.接下来,创建两个具体的观察者类,分别处理订单状态的更新

java 复制代码
/**
 * Description:
 *
 * @author: wubei
 * @date: 2023/12/6 14:10
 */
@Slf4j
public class CustomerService implements OrderObserver {

    @Override
    public void update(OrderStatus status) {
        log.info("订单状态发生改变处理CustomerService逻辑,status={},", status);
        // 具体的处理逻辑,例如发送邮件通知客户
    }
}
java 复制代码
/**
 * Description:
 *
 * @author: wubei
 * @date: 2023/12/6 14:10
 */
@Slf4j
public class Warehouse implements OrderObserver {

    @Override
    public void update(OrderStatus status) {
        log.info("订单状态发生改变处理Warehouse逻辑,status={},", status);
        // 具体的处理逻辑,例如更新库存
    }

}

6.最后,在主应用程序中使用这些类

java 复制代码
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,
相关推荐
晚安code4 小时前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11107 小时前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至1 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.1 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
沫璃染墨1 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
c萱2 天前
AI产品经理——01基础认知篇
设计模式·prompt·aigc·产品经理·ai编程·gitcode·ai-native
YYYing.2 天前
【设计模式系列 (八) 】组合模式
c++·后端·设计模式·组合模式·c/c++
geovindu3 天前
rust: Composite Pattern
开发语言·后端·设计模式·rust·组合模式
YYYing.3 天前
【设计模式系列 (七) 】桥接模式
c++·后端·设计模式·桥接模式
阿狗童鞋4 天前
设计模式实战指南
设计模式