首页 > 其他分享 >观察者模式(代码简单介绍)

观察者模式(代码简单介绍)

时间:2023-05-17 17:05:04浏览次数:44  
标签:Observer 代码 主题 观察者 模式 state 更新 void

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会被通知并自动更新。在这个模式中,改变状态的对象被称为“主题”,依赖者被称为“观察者”。

当使用观察者模式时,同样有三个核心角色:主题(Subject)、观察者(Observer)和具体观察者(Concrete Observer)。

以下是使用Java实现观察者模式的示例:

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;
    
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
    
    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }
}

 

// 观察者接口
interface Observer {
    void update(String state);
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private String name;
    
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    public void update(String state) {
        System.out.println(name + " 收到更新,新状态为: " + state);
    }
}

// 示例
public class ObserverPatternExample {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        
        Observer observer1 = new ConcreteObserver("观察者1");
        Observer observer2 = new ConcreteObserver("观察者2");
        
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        
        subject.setState("状态更新1");
        // 输出:
        // 观察者1 收到更新,新状态为: 状态更新1
        // 观察者2 收到更新,新状态为: 状态更新1
        
        subject.removeObserver(observer2);
        
        subject.setState("状态更新2");
        // 输出:
        // 观察者1 收到更新,新状态为: 状态更新2
    }
}

在上面的示例中,Subject是一个主题接口,定义了注册观察者、移除观察者和通知观察者的方法。ConcreteSubject是一个具体主题类,实现了主题接口,并维护了观察者列表和状态信息。Observer是一个观察者接口,定义了接收更新的方法。ConcreteObserver是一个具体观察者类,实现了观察者接口,并在update方法中处理更新的逻辑。

这只是观察者模式的一个简单示例,实际应用中包含更多的复杂逻辑和更多的观察者与主题之间的交互。观察者模式可以根据实际需求进行扩展和定制。例如,在实际应用中,可以考虑以下改进和扩展:

  1. 异步通知:可以在主题中实现异步通知机制,以提高性能和响应性能。主题将通知放入消息队列或使用多线程机制异步处理通知,而不是在通知方法中同步调用观察者的更新方法。

  2. 观察者状态传递:观察者可以向主题提供自身的状态信息,以便主题能够根据观察者的状态进行适当的处理或决策。

  3. 多个主题:可以存在多个主题,观察者可以选择注册和订阅特定的主题。这样,观察者可以根据自己的兴趣和需求选择感兴趣的主题,并接收相应的更新通知。

  4. 取消订阅和动态注册:观察者可以随时取消订阅主题的通知,主题也可以允许动态注册新的观察者,以便在运行时进行动态的观察者管理。

  5. 观察者优先级:可以为观察者指定优先级,以确保在通知时按照优先级顺序进行更新。高优先级的观察者将首先接收到更新通知。

  6. 多线程安全:如果在多线程环境下使用观察者模式,需要考虑线程安全性,并使用同步机制或并发工具来确保多线程访问时的正确性。

以上只是一些改进和扩展的示例,实际应用中的观察者模式的设计和实现将根据具体的需求和场景而异。

标签:Observer,代码,主题,观察者,模式,state,更新,void
From: https://www.cnblogs.com/yifanglai/p/17409284.html

相关文章

  • VSCode上的代码变量命名工具插件,让你的开发效率倍增!
    本篇文章主要讲解VSCode上的代码变量命名工具插件chtml代码命名工具的使用。日期:2023年5月15日vscode版本1.78及以上转载地址:https://blog.csdn.net/weixin_46078894,已获作者同意!插件说明CHTML是一款在线的代码命名工具,提供变量命名规则库,可以帮助开发者快速选择合适的变......
  • 淘宝关键词搜索 API 接口分析商品价格走势(商品列表,销量,价格接口,分类 ID 精准商品数据
    淘宝OpenAPI(Openapplicationprogramminginterface)是一套REST方式的开放应用程序编程接口。淘宝网根据自己提供的电子商务基础服务,抽象并做成一系列的API接口。通过这些接口,可以让外部用户能够通过程序的方式访问淘宝网的数据和平台。淘宝OpenAPI是淘宝开放平台的重要组......
  • 基于水平集进化的轮廓提取 MATLAB代码 水平集进化(LSE)
    基于水平集进化的轮廓提取MATLAB代码水平集进化(LSE)是一种著名的轮廓提取(确定对象边界)和对象分割的方法。LSE的主要缺点是重新初始化步骤。为了消除提取出的物体边界(轮廓)的不规则性,必须执行该步骤。基本上,水平集必须根据一些基于距离的准则定期重新初始化。ID:928627236002077......
  • 基于前景和背景的图像分割,流行排序模型 MATLAB代码 将图像像素
    基于前景和背景的图像分割,流行排序模型MATLAB代码将图像像素分为前景类和背景类。基于图的流形排序模型的交互式图像分割框架,该模型是一种基于图的半监督学习技术,可以根据输入数据显示的内在结构学习非常光滑的函数。通过克服传统模型中图构造的两个核心问题:图的结构和图的边缘权......
  • S2-#图像处理和特征提取,用于从茎图像中检测植物病害 ,matlab代码
    S2-#图像处理和特征提取,用于从茎图像中检测植物病害,matlab代码这段代码是为了从黄麻植物茎的图像中提取疾病影响部分而实现的。实现并应用了不同的图像处理方法,如基于色彩的分割、形态分析(侵蚀、膨胀等)、斑点检测、最大连通分量、颜色共现方法、纹理分析等。利用多类支持向量......
  • 如何提高你的代码质量?
    1可读性1.1准确命名每种编程语言都有自己的命名规范,不同语言的风格差异有大有小,下面以Java为例:Java整体命名风格为UpperCamelCase或lowerCamelCase形式。不管是类还是变量命名要见名知意,切勿使用缩写或中文;风格统一,尽量使用英文名词,切勿中英文混合;尽量避免和Java自带类库重名......
  • 1.图片去雾MATLAB代码 图像去雾技术 包括全局及局部直方图均衡化
    1.图片去雾MATLAB代码图像去雾技术包括全局及局部直方图均衡化和基于RETINEX理论去雾三种算法局部直方图和retinex(MSR)的参数,懂算法可以自己调节图像亮度含GUI界面只有代码。ID:495615931294745......
  • MATLAB图像增强代码 代码些许复杂,由本人一个朋友编写 是
    MATLAB图像增强代码代码些许复杂,由本人一个朋友编写是机器视觉和图像增强领域的应用,有gui界面,可以载入原图和参照强化的图像,读取参照图像的RGB或者HSV分量,并强化原图像,运行,corrction.m.结果如下图ID:925620010658083......
  • CST为什么要关闭 GPU 卡的 ECC 模式而开启 TCC 模式?操作使用【详解】
    在使用CST软件之前,我们一般建议大家关闭GPU卡的ECC模式而开启TCC模式。那么,为什么要进行这样一个操作呢?在此之前,给大家科普一下什么是“ECC”和“TTC”。 “ECC” 其实是ErrorCorrectionCode的缩写,是NVIDIA(英伟达) 内自带的错误纠正代码,一般是用来检查和在某些情......
  • docker-compose部署sonarqube开源代码审计和分析平台
    mkdir-p/docker/sonar/postgres/postgresqlmkdir-p/docker/sonar/postgres/datamkdir-p/docker/sonar/sonarqubechmod777-R/docker/sonar/sonarqubeecho"vm.max_map_count=262144">/etc/sysctl.confsysctl-pversion:'3'servic......