GoF设计模式(十五) - 观察者模式

C++——设计模式 面向对象的优点和缺点 面向对象的三大特点 设计模式的六大原则 单例模式(线程安全) 工厂方法模式 适配器模式 代理模式 观察者模式 策略模式 备忘录模式 模板模式 状态模式 责任链模式 装饰模式 命令模式 阅读详情

前言

观察者模式(Observer Pattern)指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式属于行为型模式。

  

模式所涉及的角色

  • 抽象主题(Subject):也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  • 具体主题(Concrete Subject):也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  • 抽象观察者(Observer):它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  • 具体观察者(Concrete Observer):实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

代码实现 

抽象通知者和具体通知者

public abstract class Subject {
    protected List<Observer> observers = new ArrayList<>();

    /**
     * 增加观察者方法
     * @param observer
     */
    public void attach(Observer observer) {
        observers.add(observer);
    }

    /**
     * 删除观察者方法
     * @param observer
     */
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public abstract void notifyObserver();
}
public class ConcreteSubject extends Subject{

    @Override
    public void notifyObserver() {
        System.out.println("具体通知者发生改变...");
        for (Observer obs : observers) {
            obs.update();
        }
    }
}

 抽象观察者和具体观察者

public abstract class Observer {
    public abstract void update();
}
public class ConcreteObserver extends Observer{

    @Override
    public void update() {
        System.out.println("具体观察者做出响应...");
    }
}

客户端

class ObserverPatternDemoApplicationTests {

	@Test
	void contextLoads() {
		ConcreteSubject concreteSubject = new ConcreteSubject();
		concreteSubject.attach(new ConcreteObserver());

		concreteSubject.notifyObserver();
	}

}

 

事件委托方式 

 抽象通知者

public class Subject {
    protected List<JdkEventListener> listeners = new ArrayList<>();

    /**
     * 添加监听器
     * @param listener
     */
    public void attach(JdkEventListener listener) {
        listeners.add(listener);
    }



    public void notifyObserver(){
        JdkEvent jdkEvent = new JdkEvent(this);
        System.out.println("具体通知者发生改变...");
        Iterator<JdkEventListener> iterator = listeners.iterator();
        if (iterator.hasNext()){
            JdkEventListener listener = iterator.next();
            listener.handler(jdkEvent);
        }
    }
}

事件

public class JdkEvent extends EventObject {

    public JdkEvent(Object source) {
        super(source);
    }

}

监听

public interface JdkEventListener extends EventListener {

    void handler(JdkEvent jdkEvent);
}

具体观察者


public class ConcreteListener implements JdkEventListener{
    @Override
    public void handler(JdkEvent jdkEvent) {
        System.out.println("具体观察者做出响应...");
    }
}

客户端

class ObserverPatternDemoApplicationTests {

	@Test
	void contextLoads() {
		Subject subject = new Subject();
		subject.attach(new ConcreteListener());
		subject.notifyObserver();
	}

}

 

源码

https://download.youkuaiyun.com/download/javanbme/81310567 

ANSYS命令流黑箱揭秘:流体渗透压力载荷的七种收敛优化策略 本文深入解析ANSYS Workbench中流体渗透压力载荷的七种收敛优化策略,重点探讨接触探测点迭代逻辑、PPCN阈值动态调整及FPAT参数优化等关键技术。通过命令流示例和实战技巧,帮助工程师有效解决流体与结构相互作用仿真中的收敛难题,提升计算效率和精度。 阅读详情

相关推荐

Ubuntu虚拟机IP卡在127.0.0.1?别慌,试试这条万能命令 `sudo dhclient`

本文详细解析了Ubuntu虚拟机IP卡在127.0.0.1的常见原因及解决方案,重点介绍了`sudo dhclient`命令的使用方法及其变体,帮助用户快速恢复网络连接。同时提供了网络诊断工具和预防措施,适用于开发者和系统管理员应对网络故障。

weixin_29251131的博客 284

设计模式之观察者模式

一、定义 观察者(Observer)模式—指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 该种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 应用实例:1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、投标项目,甲方发布招标通知,乙方去获取该消息。 二、优缺点 该模式是一种对象行为型模式,其...

ProMonkey_chen的博客 327

FIddler+Proxifer 实现PC客户端抓包详细教程

FIddler+Proxifer 实现PC客户端抓包详细教程

森明帮大于黑虎帮的博客 1万+

GOF23设计模式之观察者模式

观察者模式(Observer Pattern),用于当一对象发生改变时,能自动通知到其他依赖的对象,类似于监听机制。该模式属于行为型模式。打个现实中的例子,就比如博客主题的订阅功能,当订阅了某主题之后,该主题发布新内容会通知到所有的订阅者账号上,这其实就是一种观察者模式的应用。 上面博客主题订阅的例子中,订阅者在观察者模式中就称之为观察者对象,而主题就属于是目标对象。当目标对象做出了修改,它的所有观察者就会得到相应的内容通知。 接下来用代码实现一下这个功能。 IObserver观察者接口类有个up

minantadd的博客 291

FISCO-BCOS配置及使用控制台

如果因为网络问题长时间无法下载,请尝试:curl -#LO https://gitee.com/FISCO-BCOS/console/raw/master-2.0/tools/download_console.sh && bash download_console.sh。为了可以更加方便快捷,所以HelloWorld合约已经被内置了,位于控制台下面的contracts/solidity/HelloWorld.sol。用于获取和设置name的值,合约代码如下。部署成功会返回合约地址。

qq_51562644的博客 831

一步步指导:在Chrome中安装Vue插件vue-devtools

Vue.js是现代Web开发中最流行的前端框架之一,它以其轻量级、高性能和易于理解的设计理念受到开发者的喜爱。为了更高效地开发和调试Vue应用,Vue.js官方提供了一个强大的开发工具——vue-devtools。

小透明的博客 5619

(11)GoF设计模式之观察者模式及其实例

定义: 优点: 缺点: 适用范围: 实例: 实例UML: 实例目录: 实例代码: 运行结果截图:

雪华杉的博客 319

C# 固高板卡(总线型) 操作类

主要功能有:初始化,轴使能,正负方向手动移动,回0,点到点移动,等待移动完成,输入IO数据读取,输出IO控制,清除报警等功能。

StevenChen的博客 571

观察者模式(Observer模式)

观察者模式(Observer模式)

Greedy Hat的博客 680

【深度学习】什么是自回归模型?

自回归模型是一种重要的时间序列模型,通过利用过去的值来预测当前或未来的值。它在统计学、经济学、自然语言处理等领域有广泛的应用。自回归模型的简单性和可解释性使其成为许多应用的首选,但在更复杂的情况下,可能需要结合其他模型如移动平均模型(MA模型)或混合模型(如ARIMA)来更好地捕捉时间序列中的模式。扩散模型(Diffusion Model)和自回归模型(Autoregressive Model)是两种不同的生成模型,各自有独特的特点和应用场景。

q742971636的博客 1671

使用 Prometheus 监控 Spring Boot 应用

本文介绍了使用SpringBoot+Prometheus+Grafana实现应用监控的方案。首先在SpringBoot项目中集成Micrometer和Actuator组件,通过配置暴露Prometheus监控端点。接着配置Prometheus采集应用指标数据,并通过Grafana可视化展示。具体步骤包括:1)SpringBoot集成Micrometer;2)配置Prometheus抓取应用指标;3)安装Grafana并导入SpringBoot监控模板;4)展示JVM和业务指标。该方案可以实现对SpringB

蔡定努 430

GOF设计模式-观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察

小布的世界 1051

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

【WorkBuddy专栏36】从踩坑到上线——WorkBuddy代码开发避坑指南与部署完全手册

AI人人懂 1067

java23种设计模式个人整理_GoF设计模式合集

1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子,下面是目录:基础设计模式概述UML基础创建型模式单例模式简单工厂模式(非GoF模式)工厂方法模式抽象工厂模式原型模式建造者模式结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式行为型模式职责链模式命令模式解释器模式迭代器...

weixin_39669133的博客 105

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JAVA设计模式(十五) -- 观察者模式与发布-订阅模式

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF 给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 (一)观察者模式的组成部分 1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由...

分享技术,共同进步! 318

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

《深入浅出设计模式》学习笔记——总述

  开始学习设计模式方面的内容,首先选择《深入浅出设计模式》(Head First  Design Patterns)。准备为这些内容总结一些经验。内容将参考网络上李建忠老师的讲课、TerryLee大哥的文章、《设计模式GOF》和《C#设计模式》。以下为目录:第一章:模式简介第二章:策略模式(Strategy Pattern)第三章:观察者模式(Observer Pattern)第

蓝皮猫的专栏 2689

Android课程读书笔记,《Android源码设计模式解析与实战》读书笔记(二十五)

《Android源码设计模式解析与实战》读书笔记(二十五)第二十五章、MVC的介绍与实战1.MVC的基本介绍MVC全称是Model - View - Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC是一种框架模式而非设计模式,GOF把MVC看作是3种设计模式:观察者模式、策略模式与组合模式的合体,而核心是观察者模式。简而言之,框架是大智慧,...

weixin_39754831的博客 186

23种GoF设计模式简要概述

设计模式主要分三个类型:创建型、结构型和行为型。  其中创建型有:      一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点。     二、Abstract Factory,抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类。      三、Factory Method,工厂方法:定义一个用于创建对象的接口,让子类决

743

23种设计模式(十五)接口隔离之适配器

动机   在软件系统中,由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。   如何应对这种”迁移的变化“?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口? Adapter.cpp //目标接口(新接口) class ITarget{ public: virtual void process()=0; }; //遗留接口(老接口) class IAdaptee{ public: virtual voi

小小何先生的学习之旅 323

深入浅出设计模式【导语、内含23种设计模式和踩坑经验】

设计模式是软件工程中解决常见问题的可复用方案模板,能帮助开发者编写清晰、灵活、可维护的代码。本文将通过系列文章深入解析经典设计模式,包括单例、工厂方法、抽象工厂等,涵盖核心概念、适用场景、类图分析、实现方式及最佳实践。结合Java语言、开源框架和业务案例,旨在为开发者提供理论与实战结合的深度指南,提升系统设计能力。适合希望夯实基础或优化设计的中高级开发者参考。

NeoLshu的博客 971

设计模式(C++实现)(总)

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式乃一个程序员的内功修炼。 有很多关于设计模式的书籍,比如轻松易读的《大话设计模式》、最为经典的GoF的《设计模式》、国人的经典原创《道法自然》等,网上关于设计模式的资料也非常多,且内容全面。但关于设计模式的书籍和网上的资料使用C++代码来举例实现的并不多,例如G

huashuolin001的博客 1145

Caché 23种设计模式

Caché 23种设计模式 前章 Caché 程序员必须知道的七大原则 第一章 Caché 设计模式 简单工厂模式 第二章 Caché 设计模式 策略模式 第三章 Caché 设计模式 装饰者模式 第四章 Caché 设计模式 代理模式 第五章 Caché 设计模式 工厂方法 第六章 Caché 设计模式 原型模式 第七章 Caché 设计模式 模版方法模式 第八章 Caché 设计模式 外观模式...

yaoxin521123的博客 4403

java设计模式耿祥义_《java设计模式课件耿祥义》-公开·课件.ppt

封面 第一章 设计模式简介 1.1 什么是设计模式 1.2 设计模式的起源 1.3 GOF之著作 1.4 学习设计模式的重要性 1.5 合理使用模式 第二章 面向对象的几个基本原则 2.1 面向抽象原则 第二章 面向对象的几个基本原则 第二章 面向对象的几个基本原则 2.2 开-闭原则 2.3 高内聚-低耦合原则 第四章 命令模式 一 、 概述 ...

weixin_33764387的博客 512

《Android源码设计模式解析与实战》读书笔记(二十五)

第二十五章、MVC的介绍与实战1.MVC的基本介绍 MVC全称是Model - View - Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC是一种框架模式而非设计模式,GOF把MVC看作是3种设计模式:观察者模式、策略模式与组合模式的合体,而核心是观察者模式。

唯鹿的博客 3923

Java设计模式:核心概述(一)

设计模式是在特定上下文中为解决某一类问题而提出的一种可复用的设计方案。它不是一种具体的实现代码,而是一种解决问题的思路和方法论。通过设计模式,我们可以提高软件系统的可维护性、可扩展性和可复用性。设计模式是Java编程中不可或缺的一部分,它们为我们提供了一种解决常见问题的有效方法。通过深入学习和掌握设计模式,我们可以编写出更加优雅、可维护和可扩展的代码。

码到三十五 2041

观察者模式--不少理论阐述--摘抄他人的作品--感觉还可以

观察者模式--不少理论阐述--摘抄他人的作品软件设计模式的起源归因于 Christopher Alexander 所做的工作。 作为架构师,Alexander 注意到在给定的环境中存在常见问题及其相关的解决方案。 Alexander 将此问题/解决方案/环境三元组称为“设计模式”,架构师在构建设计过程中可通过它以统一的方式快速解决问题。 二十五年前第一次出版的 A Pattern

756
上一篇: GoF设计模式(十四) - 模版方法模式
下一篇: GoF设计模式(十六) - 迭代器模式
让程序飞
博客等级 码龄10年 8831粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值