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

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

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,
相关推荐
麓殇⊙1 小时前
设计模式--建造者模式详解
设计模式·建造者模式
不当菜虚困1 小时前
JAVA设计模式——(八)单例模式
java·单例模式·设计模式
Java致死1 小时前
工厂设计模式
java·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式
全栈凯哥3 小时前
桥接模式(Bridge Pattern)详解
java·设计模式·桥接模式
北漂老男孩4 小时前
设计模式全解析:23种经典设计模式及其应用
单例模式·设计模式
智想天开6 小时前
13.组合模式:思考与解读
docker·设计模式·容器·组合模式
学习机器不会机器学习11 小时前
深入浅出JavaScript常见设计模式:从原理到实战(2)
开发语言·javascript·设计模式
碎梦归途12 小时前
23种设计模式-行为型模式之命令模式(Java版本)
java·开发语言·jvm·设计模式·命令模式·行为型模式
〆、风神14 小时前
从零搭建高可用分布式限流组件:设计模式与Redis令牌桶实践
redis·分布式·设计模式
摘星编程15 小时前
并发设计模式实战系列(8):Active Object
设计模式·并发编程