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

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

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);
    }

    @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.接下来,创建两个具体的观察者类,分别处理订单状态的更新

/**
 * 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);
        // 具体的处理逻辑,例如发送邮件通知客户
    }
}
/**
 * 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.最后,在主应用程序中使用这些类

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. 【前端设计模式观察模式

    2023-12-10 06:58:03       41 阅读
  2. 设计模式观察模式

    2023-12-10 06:58:03       32 阅读
  3. 设计模式观察模式

    2023-12-10 06:58:03       36 阅读
  4. 设计模式观察模式

    2023-12-10 06:58:03       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 06:58:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 06:58:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 06:58:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 06:58:03       20 阅读

热门阅读

  1. 企业如何挑选适合自己的外呼机器人供应商?

    2023-12-10 06:58:03       40 阅读
  2. 【工具类】Word 转 PDF

    2023-12-10 06:58:03       39 阅读
  3. Python高级数据结构——分治法(Divide and Conquer)

    2023-12-10 06:58:03       33 阅读
  4. ASPICE-汽车软件开发能力评级

    2023-12-10 06:58:03       35 阅读
  5. 【Linux系统编程】进度条的编写

    2023-12-10 06:58:03       36 阅读
  6. 【ceph】传统分区和vg lvm 创建osd

    2023-12-10 06:58:03       42 阅读
  7. 如何前端存token,后端获取token

    2023-12-10 06:58:03       41 阅读
  8. 问题:数组对象去重

    2023-12-10 06:58:03       41 阅读