观察者模式

观察者模式(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("已发货");
    }
}
相关推荐
超级大只老咪7 小时前
数组相邻元素比较的循环条件(Java竞赛考点)
java
小浣熊熊熊熊熊熊熊丶7 小时前
《Effective Java》第25条:限制源文件为单个顶级类
java·开发语言·effective java
毕设源码-钟学长7 小时前
【开题答辩全过程】以 公交管理系统为例,包含答辩的问题和答案
java·eclipse
啃火龙果的兔子7 小时前
JDK 安装配置
java·开发语言
星哥说事7 小时前
应用程序监控:Java 与 Web 应用的实践
java·开发语言
派大鑫wink8 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
xUxIAOrUIII8 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home8 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
醇氧8 小时前
org.jetbrains.annotations的@Nullable 学习
java·开发语言·学习·intellij-idea
Java&Develop8 小时前
Aes加密 GCM java
java·开发语言·python