观察者设计模式

观察者模式用于建立对象间一对多的依赖关系。当一个对象(主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。

核心组件
  1. 主题 (Subject)

    维护观察者列表,提供注册/注销方法,通知观察者状态变化

    java 复制代码
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Subject {
        private List<Observer> observers = new ArrayList<>();
    
        public void attach(Observer o) {
            observers.add(o);
        }
    
        public void detach(Observer o) {
            observers.remove(o);
        }
    
        public void notifyObservers() {
            for (Observer o : observers) {
                o.update();
            }
        }
    }
  2. 观察者 (Observer)

    定义更新接口,接收主题通知

    java 复制代码
    public interface Observer {
        void update();
    }
具体实现示例

主题实现类

java 复制代码
public class ConcreteSubject extends Subject {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        notifyObservers();  // 状态变化时通知观察者
    }
}

观察者实现类

java 复制代码
public class ConcreteObserver implements Observer {
    private String name;
    private ConcreteSubject subject;

    public ConcreteObserver(String name, ConcreteSubject subject) {
        this.name = name;
        this.subject = subject;
        subject.attach(this);  // 自动注册到主题
    }

    @Override
    public void update() {
        System.out.println(name + " 收到更新: 状态值 = " + subject.getState());
    }
}
使用示例
java 复制代码
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        
        new ConcreteObserver("观察者A", subject);
        new ConcreteObserver("观察者B", subject);

        subject.setState(10);  // 触发通知
        subject.setState(20);  // 再次触发通知
    }
}
输出结果
复制代码
观察者A 收到更新: 状态值 = 10
观察者B 收到更新: 状态值 = 10
观察者A 收到更新: 状态值 = 20
观察者B 收到更新: 状态值 = 20
模式优势
  1. 松耦合:主题无需知道观察者的具体实现
  2. 动态关系:可随时添加/删除观察者
  3. 广播通信:一次状态变化可通知多个对象
  4. 符合开闭原则:新增观察者无需修改主题代码
典型应用场景
  • GUI 事件处理(如按钮点击)
  • 消息订阅系统
  • 股票价格变动通知
  • 游戏中的成就系统
  • 分布式系统的状态同步

注意 :Java 内置 java.util.ObservableObserver 接口已过时(Java 9+),推荐使用自定义实现或 java.beans.PropertyChangeListener 替代。

相关推荐
Advancer-26 分钟前
第二次蓝桥杯总结(上)
java·算法·职场和发展·蓝桥杯
\xin37 分钟前
pikachu自编SQL(POST)
java·数据库·sql
一行代码一行诗++39 分钟前
注释是什么和注释该怎么写(C语言)
java·前端·javascript
JAVA面经实录9171 小时前
企业级java+LangChain4j-RAG系统 限流熔断降级
java·开发语言·分布式·langchain
Drug1 小时前
Struts2 从入门到放弃?不,这些核心知识你依然需要掌握
java
Slow菜鸟1 小时前
Codex CLI 教程(五)| AI 驱动项目从零到一:面向 Java 全栈工程师打造个人 ECC(V2版)
java·开发语言·人工智能
月落归舟1 小时前
java基础之拷贝、单例
java·单例·拷贝
鬼蛟1 小时前
什么是 Git
java
直奔標竿2 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD2 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring