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

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

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,
相关推荐
大G的笔记本8 小时前
Java常见设计模式面试题(高频)
java·开发语言·设计模式
老鼠只爱大米8 小时前
Java设计模式之建造者模式(Builder)详解
java·设计模式·建造者模式·builder·23种设计模式
guangzan14 小时前
常用设计模式:职责链模式
设计模式
ZHE|张恒14 小时前
设计模式实战篇(二):业务逻辑“随时切换招式”——策略模式(Strategy Pattern)解析
设计模式·策略模式
小二·17 小时前
设计模式面试题(14道含答案)
设计模式
老鼠只爱大米1 天前
Java 设计模式之适配器模式:系统集成的万能接口
java·设计模式·适配器模式·adapter·java设计模式
o0向阳而生0o1 天前
112、23种设计模式之命令模式(20/23)
设计模式·命令模式
将编程培养成爱好1 天前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式
猿太极1 天前
设计模式学习(3)-行为型模式
c++·设计模式
快乐非自愿1 天前
常用设计模式:工厂方法模式
javascript·设计模式·工厂方法模式