观察者模式详解

devtools/2025/1/12 15:51:02/

观察者模式详解
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/devtools/149907.html

相关文章

Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档

目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试&#xff1f; 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…

MongoDB中的索引是提高查询效率的重要工具

MongoDB中的索引是提高查询效率的重要工具&#xff0c;能够极大地优化数据检索过程。以下是对MongoDB索引设置的详细解释&#xff1a; 一、索引类型 单字段索引 在单个字段上建立的索引。对于单字段索引和排序操作&#xff0c;索引键的排序顺序&#xff08;升序或降序&#xf…

通过氧化最小化工艺提高SiC MOSFET迁移率的深入分析

标题 Insight Into Mobility Improvement by the Oxidation-Minimizing Process in SiC MOSFETs&#xff08;TED2024&#xff09; 文章的研究内容 文章的研究内容主要围绕氧化最小化工艺&#xff08;oxidation-minimizing process&#xff09;对碳化硅&#xff08;SiC&…

《计算机视觉解锁图像理解密码:编程实现图片场景文字描述生成》

《计算机视觉解锁图像理解密码&#xff1a;编程实现图片场景文字描述生成》 一、AI 时代的 “看图说话” 魔法二、基石之固&#xff1a;核心技术原理解析&#xff08;一&#xff09;图像识别先锋 —— 卷积神经网络&#xff08;CNN&#xff09;&#xff08;二&#xff09;文本创…

MacOS带端口ping

在Mac上&#xff0c;原生的ping命令只能用于检测网络主机的连通性&#xff0c;它并不能直接ping某个特定的端口。为了ping某个端口&#xff0c;我们需要借助其他工具或方法。以下是两种在Mac上ping端口的方法&#xff1a; 1、使用telnet命令‌&#xff1a; telnet是一个网络协议…

LLaMA-Factory web微调大模型并导出大模型

LLaMA-Factory 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xff08;pt&#xff09;&am…

Windows使用AutoHotKey解决鼠标键连击现象(解决鼠标连击、单击变双击的故障)

注&#xff1a;罗技鼠标&#xff0c;使用久了之后会出现连击现象&#xff0c;如果刚好过保了&#xff0c;可以考虑使用软件方案解决连击现象&#xff1a; 以下是示例AutoHotKey脚本&#xff0c;实现了调用XButton1用于关闭窗口&#xff08;以及WinW&#xff0c;XButton2也导向…

Unity自带的真车模拟系统,速度不够大r时如何以匀速上桥

在 Unity 中&#xff0c;如果你使用自带的真车模拟系统&#xff08;如 Wheel Collider&#xff09;时&#xff0c;发现车辆上桥时速度不够&#xff0c;导致无法顺利上坡&#xff0c;可以通过以下方法调整车辆的行为&#xff0c;使其能够以匀速上桥&#xff1a; 1. 调整 Wheel C…