观察者模式

观察者模式(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("已发货");
    }
}
相关推荐
布谷歌10 分钟前
Oops! 更改field的数据类型,影响到rabbitmq消费了...(有关于Java序列化)
java·开发语言·分布式·rabbitmq·java-rabbitmq
PXM的算法星球11 分钟前
java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
java·gpt·microsoft
被程序耽误的胡先生15 分钟前
java中 kafka简单应用
java·开发语言·kafka
F202269748627 分钟前
Spring MVC 对象转换器:初级开发者入门指南
java·spring·mvc
楠枬1 小时前
网页五子棋——对战后端
java·开发语言·spring boot·websocket·spring
YXWik61 小时前
23种设计模式
java·设计模式
不修×蝙蝠1 小时前
Tomcat理论(Ⅰ)
java·服务器·java-ee·tomcat
攻城狮7号1 小时前
【第三节】C++设计模式(创建型模式)-单例模式
c++·单例模式·设计模式
曲奇是块小饼干_1 小时前
leetcode刷题记录(一百零八)——322. 零钱兑换
java·算法·leetcode·职场和发展