观察者模式

观察者模式(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("已发货");
    }
}
相关推荐
维天说1 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19941 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
杨充2 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充2 小时前
12.综合实战图片框架
设计模式·开源·代码规范
噢,我明白了2 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品2 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘2 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记3 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵3 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室4 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发