观察者模式详解

ops/2025/1/12 9:52:17/

观察者模式详解
1. 定义与描述
观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多依赖关系。这种模式中,有一个被观察的对象(称为主题Subject)和多个观察该对象的观察者(Observer)。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知所有观察者。
2. 结构与角色
观察者模式包含以下几个角色:
•  主题(Subject):定义了观察者注册、移除和通知的方法。
•  具体主题(ConcreteSubject):实现主题接口,维护一个观察者列表,当状态发生变化时通知所有观察者。
•  观察者(Observer):定义了一个更新接口,当接收到主题的通知时更新自己。
•  具体观察者(ConcreteObserver):实现观察者接口,更新自己的状态以与主题的状态保持一致。
3. 适用场景
观察者模式适用于以下场景:
•  当一个对象的改变需要同时改变其他对象,而不知道具体有多少个对象有待改变时。
•  当一个抽象模型有两个方面,其中一个方面依赖于另一方面,这时可以通过观察者模式将这两者封装在独立的对象中以使它们各自独立地改变和复用。
•  当对一个对象的改变需要广播到其他对象时。
4. 应用实例
观察者模式广泛应用于各种需要通知多个对象进行同步更新的场合,包括但不限于:
•  GUI事件监听机制:在图形用户界面编程中,按钮、文本框等控件的事件处理通常使用观察者模式。
•  数据模型与视图同步:在MVC架构中,观察者模式常用于数据模型和视图之间的更新同步。
•  发布-订阅系统:观察者模式是发布-订阅系统的基础,允许不同的服务订阅某个主题并接收通知。
•  股票价格监控:在金融系统中,观察者模式可以让股票价格的变化自动通知所有依赖该数据的系统。
•  社交媒体的通知机制:当用户发布新动态时,所有关注者都会收到通知。
5. 代码示例
以下是一个简单的观察者模式的代码示例,展示了如何实现一个股票价格通知系统:
public interface IStock {
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

public class Stock implements IStock {
    private List<IObserver> _observers = new ArrayList<>();
    private String symbol;
    private double price;

    public Stock(String symbol, double price) {
        this.symbol = symbol;
        this.price = price;
    }

    public String getSymbol() {
        return symbol;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
        NotifyObservers();
    }

    @Override
    public void RegisterObserver(IObserver observer) {
        _observers.add(observer);
    }

    @Override
    public void RemoveObserver(IObserver observer) {
        _observers.remove(observer);
    }

    @Override
    public void NotifyObservers() {
        for (IObserver observer : _observers) {
            observer.Update(this);
        }
    }
}

public interface IObserver {
    void Update(Stock stock);
}

public class StockObserver implements IObserver {
    private String name;

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

    @Override
    public void Update(Stock stock) {
        System.out.println("Observer " + name + ": Stock " + stock.getSymbol() + " price updated to " + stock.getPrice());
    }
}

// 客户端代码
public class Program {
    public static void main(String[] args) {
        Stock appleStock = new Stock("AAPL", 150.00);
        IObserver observer1 = new StockObserver("Observer1");
        IObserver observer2 = new StockObserver("Observer2");

        appleStock.RegisterObserver(observer1);
        appleStock.RegisterObserver(observer2);
        appleStock.setPrice(155.00);
        appleStock.setPrice(160.00);
        appleStock.RemoveObserver(observer1);
        appleStock.setPrice(165.00);
    }
}

在这个示例中,Stock 类是具体的主题,StockObserver 是具体观察者,它们通过RegisterObserver和RemoveObserver方法注册和注销观察者,并通过NotifyObservers方法在状态变化时通知所有观察者。


http://www.ppmy.cn/ops/149413.html

相关文章

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

【计算机网络】第六章·应用层

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2…

PPT素材免费下载

下载免费的PPT模板、素材、背景、图表、课件等等就上这6个网站&#xff0c;赶紧收藏&#xff01; 1、菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&#xff0c;全…

Mysql连接报错排查解决记录

Mysql连接报错排查解决记录 背景&#xff1a; 系统&#xff1a;uos server-1060e​ 运行环境kvm虚拟机​ mysql版本&#xff1a;5.7.44, for Linux (x86_64)问题现象&#xff1a; 宿主机重启后&#xff0c;kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接…

PHP获取局域网ip(192.168)

有时候&#xff0c;程序中&#xff0c;需要获取本机内网ip的情况&#xff0c;经过各种资料查找&#xff0c;最终确定一下代码&#xff1a; //获取内网ipfunction getLocalIP() {exec("ipconfig /all",$arr);$res mb_convert_encoding($arr, UTF-8, GBK);$ip ;fore…

python 个人学习笔记

个人学习笔记 关键字 if __name__ __main__ if __name__ __main__: 是 Python 中一个常用的代码结构&#xff0c;它的作用是判断当前脚本是否作为主程序直接运行&#xff0c;还是被作为模块导入到其他脚本中使用。 以下详细解释&#xff1a; __name__ 是 Python 中的一个内置…

深入NLP核心技术:文本张量表示与词嵌入全面解析

系列文章目录 01-中文NLP入门必备&#xff1a;全面解析分词、命名实体识别与词性标注&#xff08;附详细实战案例&#xff09; 02-深入NLP核心技术&#xff1a;文本张量表示与词嵌入全面解析 文章目录 系列文章目录前言一、文本张量表示1.1 文本张量表示简介1.1.1 举例说明1.1…

运行.Net 7 Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…