观察者模式

观察者模式(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("已发货");
    }
}
相关推荐
weixin_4896900212 分钟前
【IDEA 2025.2.4】 Maven 仅能手动 Reload All Maven Projects 问题解决
java·maven·intellij-idea
雨辰AI13 分钟前
MySQL 迁移至达梦 DM9 完整改造指南|99% SQL 零改动
java·开发语言·数据库·sql·mysql·政务
golang学习记13 分钟前
Intellij IDEA 2026重磅更新!开发体验大升级
java·ide·intellij-idea
弹简特16 分钟前
【Java项目-轻聊】05-AI赋能设计接口文档
java·开发语言
达达爱吃肉26 分钟前
claude 接入deepseek 运行报错
java·服务器·前端
OctShop大型商城源码26 分钟前
OctShop对比JAVA商城源码_OctShop大型专业级多用户商城源码
java·开发语言·商城系统·小程序商城·octshop
guslegend29 分钟前
AGENT.md,Skill与工程规范
java·开发语言·数据库
周末也要写八哥33 分钟前
C++中单线程方式之无脑上锁
java·开发语言·c++
Reisentyan40 分钟前
[Advance]GoLang Learn Data Day 4
java·数据库·golang
MaCa .BaKa1 小时前
55-宠物爱心救助领养系统-宠物救助领养系统
java·vue.js·tomcat·maven·springboot·宠物救助领养系统