温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

观察者模式如何实现

发布时间:2026-07-18 14:34:37 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

观察者模式(Observer Pattern)是一种行为型设计模式,用于实现一对多的依赖关系:当一个对象(被观察者 / 发布者)状态发生变化时,会自动通知所有依赖它的对象(观察者 / 订阅者)。


一、核心思想

被观察者变化 → 自动通知 → 观察者更新

典型应用:

  • 事件监听
  • 消息订阅(MQ、事件总线)
  • UI 框架(MVC、MVVM)

二、角色结构

角色 说明
Subject(被观察者) 维护观察者列表,状态变化时通知观察者
Observer(观察者接口) 定义更新方法
ConcreteSubject 具体被观察者
ConcreteObserver 具体观察者

三、实现方式一:经典实现(接口 + 注册)

1️⃣ 观察者接口

public interface Observer {
    void update(String message);
}

2️⃣ 被观察者(Subject)

import java.util.ArrayList;
import java.util.List;

public class Subject {

    private List<Observer> observers = new ArrayList<>();
    private String state;

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

3️⃣ 具体观察者

public class ConcreteObserverA implements Observer {
    @Override
    public void update(String message) {
        System.out.println("ObserverA 收到消息:" + message);
    }
}
public class ConcreteObserverB implements Observer {
    @Override
    public void update(String message) {
        System.out.println("ObserverB 收到消息:" + message);
    }
}

4️⃣ 使用

public class Main {
    public static void main(String[] args) {
        Subject subject = new Subject();

        Observer a = new ConcreteObserverA();
        Observer b = new ConcreteObserverB();

        subject.attach(a);
        subject.attach(b);

        subject.setState("状态发生变化");
    }
}

✅ 输出:

ObserverA 收到消息:状态发生变化
ObserverB 收到消息:状态发生变化

四、实现方式二:Java 内置观察者(已过时)

Java 早期提供:

  • java.util.Observable
  • java.util.Observer

⚠️ 不推荐,因为设计缺陷,Java 9 已标记为过时。


五、实现方式三:事件 / 回调方式(更现代)

import java.util.function.Consumer;
import java.util.ArrayList;
import java.util.List;

public class EventBus {
    private List<Consumer<String>> listeners = new ArrayList<>();

    public void subscribe(Consumer<String> listener) {
        listeners.add(listener);
    }

    public void publish(String event) {
        listeners.forEach(l -> l.accept(event));
    }
}
EventBus bus = new EventBus();
bus.subscribe(msg -> System.out.println("收到:" + msg));
bus.publish("Hello Observer");

✅ 更灵活,适合事件驱动系统。


六、观察者模式优缺点

✅ 优点

  • 解耦(被观察者不依赖具体观察者)
  • 支持动态订阅 / 取消
  • 易于扩展

❌ 缺点

  • 观察者过多时通知性能问题
  • 容易造成循环触发
  • 通知顺序不可控

七、典型应用场景

  • GUI 事件监听(按钮点击)
  • Spring 的 ApplicationListener
  • Vue / React 响应式系统
  • 消息队列、事件总线

如果你愿意,我可以:

  • UML 图解释
  • Python / JavaScript 实现
  • 结合 Spring 事件机制讲解

你更想看哪一种?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI