设计模式之观察者模式

发布于:2025-07-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

定义

       观察者模式(Observer Pattern)是一种‌行为型设计模式‌,定义对象间一对多的依赖关系。当核心对象(被观察者)状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新自身状态‌。
       其核心特点包括:
       1)‌松耦合‌:被观察者无需知晓观察者的具体实现细节,仅通过抽象接口交互‌。
       2)‌自动通知‌:状态变化触发自动广播,减少手动调用‌。
       3)‌别名‌:又称‌发布-订阅模式‌(Publisher-Subscriber),强调消息的分发机制。

结构

在这里插入图片描述

适用场景

       观察者模式适用于以下典型场景:
       1)‌事件驱动系统‌
‌       示例‌:GUI按钮点击事件(点击后触发多个组件响应)、异步任务完成通知‌。
       ‌优势‌:分离事件触发与处理逻辑,避免轮询消耗资源‌。
       2)‌数据同步需求‌
       ‌示例‌:股票价格变动时,实时推送至所有订阅用户的终端‌;
       多人游戏中玩家状态同步至其他客户端‌。
       3)‌状态监控与日志‌
‌示例‌:服务器运行状态变更时,通知监控系统记录日志并触发警报‌。
       4)‌跨模块解耦‌
‌       示例‌:电商系统中,订单状态更新后自动通知库存、物流、支付模块‌。

使用示例

       模拟微信公众号推送机制:公众号(被观察者)发布新文章时,所有订阅用户(观察者)收到通知。
       定义被观察者

/**
 * 抽象被观察者(Subject)
 */
public interface Publisher {

    void addSubscriber(Subscriber s);  // 添加观察者

    void removeSubscriber(Subscriber s);

    void notifySubscribers(String msg); // 通知所有观察者

}

       定义具体被观察者

/**
 * 具体被观察者:微信公众号
 */
public class WeChatPublicAccount implements Publisher {

    private List<Subscriber> subscribers = new ArrayList<>();

    /**
     * 定义发布文章方法,该方法会触发通知观察者
     *
     * @param title
     */
    public void publishArticle(String title) {
        System.out.println("发布新文章:" + title);
        notifySubscribers(title);
    }

    @Override
    public void addSubscriber(Subscriber s) {
        subscribers.add(s);
    }

    @Override
    public void removeSubscriber(Subscriber s) {
        subscribers.remove(s);
    }

    @Override
    public void notifySubscribers(String msg) {
        for (Subscriber s : subscribers) {
            s.update(msg);
        }
    }

}

       定义抽象观察者

/**
 * 抽象观察者(Observer)
 */
public interface Subscriber {

    void update(String msg);

}

       定义具体观察者

public class User implements Subscriber {

    private String name;

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

    @Override
    public void update(String msg) {
        System.out.println(name + " 收到通知:" + msg);
    }

}

       测试

public class Client {

    public static void main(String[] args) {

        WeChatPublicAccount account = new WeChatPublicAccount();

        account.addSubscriber(new User("Alice"));

        account.addSubscriber(new User("Bob"));

        account.publishArticle("观察者模式实战指南");

    }

}