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

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

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,
相关推荐
胖虎11 小时前
iOS中的设计模式(十)- 中介者模式(从播放器场景理解中介者模式)
设计模式·中介者模式·解耦·ios中的设计模式
Geoking.1 小时前
【设计模式】组合模式(Composite)详解
java·设计模式·组合模式
刀法孜然1 小时前
23种设计模式 3 行为型模式 之3.6 mediator 中介者模式
设计模式·中介者模式
Yu_Lijing2 小时前
基于C++的《Head First设计模式》笔记——单件模式
c++·笔记·设计模式
Geoking.2 小时前
【设计模式】外观模式(Facade)详解
java·设计模式·外观模式
点云SLAM2 小时前
C++设计模式之单例模式(Singleton)以及相关面试问题
c++·设计模式·面试·c++11·单例模式(singleton)
坚定学代码15 小时前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai
GISer_Jing17 小时前
AI Agent 目标设定与异常处理
人工智能·设计模式·aigc
蔺太微18 小时前
组合模式(Composite Pattern)
设计模式·组合模式
鱼跃鹰飞20 小时前
DDD中的防腐层
java·设计模式·架构