验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

观察者模式如何实现

阅读:207 来源:乙速云 作者:代码code

观察者模式如何实现

观察者模式(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 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> listeners = new ArrayList<>();

    public void subscribe(Consumer 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 事件机制讲解

你更想看哪一种?

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>