观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,常用于实现发布/订阅机制。当一个对象状态发生改变时,它会通知依赖它的其他对象,使它们自动更新。以下是一个实际业务中的例子:一个简单的"订单状态更新通知系统"。

举例:业务场景

一个电商系统中,当订单状态发生变化时,系统需要通知用户和物流系统。使用观察者模式可以很好地解耦通知逻辑和订单状态的变化。

java 复制代码
import java.util.ArrayList;
import java.util.List;

// 定义观察者接口
interface Observer {
    void update(String orderId, String status);
}

// 具体观察者:用户
class UserObserver implements Observer {
    private String name;

    public UserObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String orderId, String status) {
        System.out.println("用户 " + name + " 收到通知:订单 " + orderId + " 状态变更为:" + status);
    }
}

// 具体观察者:物流系统
class LogisticsObserver implements Observer {
    @Override
    public void update(String orderId, String status) {
        System.out.println("物流系统接收通知:订单 " + orderId + " 状态变更为:" + status);
        if ("已发货".equals(status)) {
            System.out.println("物流系统开始处理发货流程。");
        }
    }
}

// 被观察者:订单
class Order {
    private String orderId;
    private String status;
    private List<Observer> observers = new ArrayList<>();

    public Order(String orderId) {
        this.orderId = orderId;
    }

    // 添加观察者
    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    // 移除观察者
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    // 设置状态并通知观察者
    public void setStatus(String status) {
        this.status = status;
        System.out.println("订单 " + orderId + " 状态更新为:" + status);
        notifyObservers();
    }

    // 通知所有观察者
    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(orderId, status);
        }
    }
}

// 测试代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建订单
        Order order = new Order("12345");

        // 创建观察者
        UserObserver user = new UserObserver("张三");
        LogisticsObserver logistics = new LogisticsObserver();

        // 注册观察者
        order.addObserver(user);
        order.addObserver(logistics);

        // 更新订单状态
        order.setStatus("待支付");
        order.setStatus("已支付");
        order.setStatus("已发货");
    }
}
相关推荐
侠客行03173 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪3 小时前
深入浅出LangChain4J
java·langchain·llm
老毛肚5 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎5 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
Yvonne爱编码6 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚6 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂6 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
fuquxiaoguang6 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
琹箐6 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
__WanG6 小时前
JavaTuples 库分析
java