23种设计模式-18观察者(Observer)模式

观察者模式

适合阅读本专栏的人群包括:

  • 想提升代码质量和架构思维的 Java 开发者
  • 在工作中面对复杂业务、代码难以维护的工程师
  • 想准备面试、系统复习设计模式知识的同学

阅读完本专栏,你将掌握:

  • 23 种设计模式的结构、适用场景和最佳实践
  • 面向对象六大设计原则的使用方式
  • 如何用设计模式解决常见业务场景问题
  • 如何重构低质量代码,提升扩展性与可维护性

任何问题都可以在留言区指出,作者看到后会第一时间回复。

概念总是生僻的,可以结合代码多体会多练习。

如果本文章给你带来一点点收获请点点赞支持一下,谢谢各位架构师,技术专家,专业大拿。

其他模式详解:设计模式入门

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得一个对象(称为主题或被观察者)的状态发生改变时,所有依赖于它的对象(称为观察者)都会被自动通知并更新。

适用场景

  • 一个对象状态变化,需要通知其他多个对象
  • 多方监听同一目标对象的变化
  • 建立对象之间的"消息联动"关系,但不希望强耦合
  • 系统存在事件机制,如订阅/发布模型
  • 支持动态增加或移除关联对象

结构

  1. Subject(主题或被观察者):维护一组观察者并通知它们状态的变化。
  2. Observer(观察者):定义一个更新接口,以便在主题状态改变时得到通知。
  3. ConcreteSubject(具体主题):实现具体的主题对象,状态变化时通知所有注册的观察者。
  4. ConcreteObserver(具体观察者):实现具体的观察者对象,在收到通知时进行相应的更新操作。

代码示例

java 复制代码
// 定义观察者接口
interface Observer {
    void update(String message);
}

// 定义被观察者接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 实现具体的被观察者
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String message;

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }

    public void setMessage(String message) {
        this.message = message;
        notifyObservers();
    }
}

// 实现具体的观察者
class ConcreteObserver implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

// 测试观察者模式
public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        Observer observer1 = new ConcreteObserver("Observer1");
        Observer observer2 = new ConcreteObserver("Observer2");

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        subject.setMessage("Hello, Observers!");

        subject.removeObserver(observer1);

        subject.setMessage("Observer1 removed");
    }
}

总结

​ 观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当被观察对象(Subject)的状态发生变化时,会自动通知所有依赖它的观察者(Observer),从而实现状态变化的联动更新。该模式有效降低对象之间的耦合,使观察者可动态增加、移除,实现灵活的事件通知机制,常用于事件发布订阅、数据驱动 UI 更新、消息推送等场景。

相关推荐
Slow菜鸟1 小时前
Java项目基础架构(一)| 工程架构选型指南
java·开发语言·架构
专注于大数据技术栈1 小时前
java学习--注解之@Deprecated
java·学习
CoderYanger1 小时前
动态规划算法-斐波那契数列模型:1.第N个泰波那契数
开发语言·算法·leetcode·动态规划·1024程序员节
zore_c1 小时前
【C语言】文件操作详解2(文件的顺序读写操作)
android·c语言·开发语言·数据结构·笔记·算法·缓存
飞梦工作室1 小时前
Spring Boot3 + Milvus2 实战:向量检索应用开发指南
java·spring boot·后端
weixin_462446231 小时前
使用 Python + Tkinter + openpyxl 实现 Excel 文本化转换
开发语言·python·excel
大袁同学1 小时前
【C++完结篇】:深入“次要”但关键的知识腹地
开发语言·数据结构·c++·算法
m0_740043731 小时前
mapState —— Vuex 语法糖
java·前端·javascript·vue.js
廋到被风吹走1 小时前
【JDK版本】JDK1.8相比JDK1.7 JVM(Metaspace 与 G1 GC)
java·开发语言·jvm