设计模式学习之路(二) ——观察者模式

设计模式二之观察者模式学习笔记 设计模式二之观察者模式学习笔记需求开始设计观察者模式解决气象站的问题 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变时,它的所有依赖者都会收到通知并自动更新。 业务需求如下: 需求 某公司有个气象装置,这个气象装置要通过温度、湿度、气压感应装置得到数据,然后通过一个系统 将天气状况显示在布告板上,暂时有三个布告板分别显示目前状况、气象统计和天气预报,要根据天气的变化及时更新布告板... 阅读详情

观察者模式(Observer Pattern)


定义:定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

认识观察者模式:我们就拿报纸的订阅为例。

  1. 报社(Subject)的业务就是出版报纸。
  2. 向报社订阅报纸,只要他们有新报纸出版,就会给订阅的人(Observer)送去。
  3. 当订阅的人(Observer)不想在看报纸时,可以取消订阅,报社(Subject)就不会再送报纸。
  4. 只要报社(Subject)还在运营,就会有人去订阅或取消报纸。
    报社 + 订阅者 = 观察者模式
    Subject(主题):负责给已经注册观察者发送新消息。
    Observer(观察者):向 Subject 进行注册后,可收到新信息。

摘自《HeadFirst设计模式》
这里写图片描述

意义:当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

具体代码实现:假设实现广播功能,广播台就是实现 Subject 的实体,听众就是观察者

Sbuject.java: 给广播台实现用

public interface Subject {
    //以下两个方法都需要传入一个观察者作为变量,该观察者用于注册和删除
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);

    //当主题有新消息,调用这个来通知观察者们
    public void notifyObservers();
}

Observer.java:给听众(观察者)实现,实现消息更新

public interface Observer {
    public void update(String message);
}

DisplayElement.java:显示新消息功能

public interface DisplayElement {
    public void display();
}

BroadCast.java:广播台

public class Broadcast implements Subject{
    private String message;
    private List<Observer> observerList;//观察者列表,用于保存对实现了 Observer 接口实现类的引用

    public Broadcast() {
        observerList = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        observerList.add(o);//注册观察者

    }

    @Override
    public void removeObserver(Observer o) {
        observerList.remove(o);//移除观察者

    }

    @Override
    //通知观察者
    public void notifyObservers() {
        for(Observer o : observerList){
            o.update(message);//调用观察者的 update 方法更新观察者的信息
        }   
    }
    //消息有更新是调用
    public void haveNewMessage(){
        notifyObservers();
    }
    //更新消息
    public void setNewMessage(String message){
        this.message = message;
        haveNewMessage();
    }
}

ObserverA.java:实现类观察者接口的观察者

public class ObserverA implements Observer,DisplayElement {
    private Subject broadcast;//对广播台的引用
    private String message;

    public ObserverA(Subject broadcast) {
        this.broadcast = broadcast;//创建观察者是传入广播台
        broadcast.registerObserver(this);//向广播台进行注册
    }

    @Override
    public void display() {
        System.out.println("I'm observerA,I recieve a new message: " + message );

    }

    @Override
    public void update(String message) {
        this.message = message;//更新消息
        display();//展示消息
    }

}

测试:

@Test
    public void test(){
        Broadcast broadcast = new Broadcast();
        ObserverA observerA = new ObserverA(broadcast);//创建观察者A并向广播台注册
        ObserverB observerB = new ObserverB(broadcast);//同理

        //更新广播台消息
        broadcast.setNewMessage("hello");
        broadcast.setNewMessage("a");
        broadcast.setNewMessage("b");
        broadcast.setNewMessage("c");

    }

测试结果:
I’m observerA,I recieve a new message: hello
I’m observerB,I recieve a new message: hello
I’m observerA,I recieve a new message: a
I’m observerB,I recieve a new message: a
I’m observerA,I recieve a new message: b
I’m observerB,I recieve a new message: b
I’m observerA,I recieve a new message: c
I’m observerB,I recieve a new message: c

Android 设计模式学习(二)观察者模式应用实例 前言 最近在遇到了 Android 的开发中常用到的设计模式之观察者模式,观察者模式,所谓的模式就是一种设计思想,可以按照某种模式,写出更合理,简单,有效的代码。可以用在 Android 开发中,也可以用在 Java,C#等等开发中,就类似单例模式,代理模式,模版等等。 观察者模式在实际项目中使用的也是非常频繁的,它最常用的地方是 GUI 系统、订阅——发布系统等。因为这个模式的一个重要作用就是解耦,使得它们之间的依赖性更小,甚至做到毫无依赖。以 GUI 系统来说,应用的 UI 具有易变性,尤其是前期随着业 阅读详情

相关推荐

Unity3D设计模式学习之观察者模式(二)

上一篇只是简单的写了观察者模式,对观察者模式只是有个大致的了解,设计模式一般都比较抽象,在实际使用思需要根据需求来设计、重构,这篇就看看书上的例子,加深理解。 实现说明 游戏事件系统的实现 //游戏事件系统的实现 public enum ENUM_GameEvent{ None = 0, EnemyKilled = 1, //敌方单位阵亡 SoldierKil...

liaosheng:) 748

设计模式练习(17)——观察者模式

观察者模式 一、题目:某公司欲开发一套机房监控系统,如果机房达到一定指定温度,传感器将作出反应,将信号传递给响应设备,如警示灯将闪烁,报警器将发出警报,安全逃生门将自动开启、隔热门将自动关闭,每一响应设备的行为右专门的程序来控制,为支持将来引入新类型的响应设备,用观察者模式设计该系统 (1)绘制观察者模式结构视图 (2)给出实例类图并实现代码二、所用模式结构视图: 三、实例类图:四、实例实现代码

秘密基地 8869

网络攻防实验——网络监听

利用CAIN实现ARP监听。

Trieyes_of_feng的博客 3193

(十九)观察者模式

目录基本简介基本思路 基本简介 定义:在对象之间定义一种一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会接收到通知,并自动更新 基本思路 ...

MuskMelon 240

J-SCOPE实战:除了看波形,如何用它和JLink-RTT模式高效调试你的STM32变量?

本文详细介绍了如何利用J-SCOPE和JLink-RTT模式高效调试STM32变量,实现实时数据可视化。通过对比HSS和RTT模式的优劣,提供固件端配置、J-SCOPE设置及实战应用案例,帮助开发者快速掌握这一高效调试技术,特别适用于电机控制、传感器融合等需要实时监控的场景。

weixin_29159613的博客 444

基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,通过建立PMSM非线性状态空间模型,设计IOL控制器将系统转化为线性输入-输出映射。文章包含系统原理推导、Simulink建模步骤、参数整定方法和仿真结果分析,验证了IOL在高动态、宽速域工况下的优越性能(转矩误差降低90%)。最后提出了工程实现要点和扩展应用方向,为开发高精度电机驱动系统提供了实用指导。

xiaoheshang_123的博客 304

观察者模式和单例模式练习

用单例模式和观察者模式试着练习写了一个模拟游戏战斗场景载入功能: 实现功能: 主角只有一个,不允许存在多个主角 主角调用方法通知怪物类做出反应 Program.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5...

weixin_30718391的博客 178

低功耗设计:如何计算power switch的数量?

power switch加多了漏电高,加少了ir drop会有问题,具体加多少合适要如何计算呢?这里可以给一个参考方式。 第一步,先选switch cell的类型 通常选用HVT类型的switch cell,优点是漏电更低,缺点也很明显,电阻大,压降也大,switch cell的大小选择,可以选择(开启电阻x面积)最小的switch cell,即单位面积提供最小并联电阻的cell类型。 第二步,计算数量 选好类型,确定了开启电阻,可以按照如下公式计算数量: Ron/Xnum • W/V = V•P

m0_61544122的博客 3570

Kubernetes RBAC权限问题

Kubernetes RBAC权限问题在配置Ingress出现以下问题,是由于RBAC配置引起。RBAC在Kubernetes1.6开始引用。使用API版本也不同,因此,在配置yaml文件时需要注意。这里我们通过一个例子来解决RBAC的问题,当然,关于RBAC的概念在这里好像没有提及到。I0531 02:36:29.882636 7 launch.go:101] &{NGINX 0.9.

wenwst的专栏 7475

Android Binder——数据传递载体(二十一)

同一进程间的对象传递都是通过引用来做的,因而本质上就是传递了一个内存地址。而跨进程采用了虚拟内存机制,两个进程都有自己独立的内存地址空间,所以跨进程传递的地址值是无效的。进程间的数据传递是 Binder 机制中的重要一环,Android 系统中担负这一重任的就是 Parcel。Parcel 是一种数据的载体,用于承载希望通过 IBinder 发送的相关信息(包括数据和对象引用)。正是基于 Parcel 这种跨进程传输数据的能力,进程间的 IPC 通信才能更加平滑可靠。

小旭的专栏 575

静态编译Qt5源码(Kylin-Desktop-V10-SP1-2203-LoongArch64+qt5.15.16)

之前的文档,记录的是通用情况,本次笔者记录下Qt5的静态编译过程,供有需要的小伙伴参考使用的操作系统是Kylin-Desktop-V10-SP1-General-Release-2203-LoongArch64,处理器是龙芯3A5000,架构是loongarch。

aggs1990的专栏 1401

01观察者模式(一)

1.观察者定义了一种一对多依赖关系,让多个观察者同时监听某个主题对象。这个主题对象在状态上发生变化时,会通知所有的观者对象,让他们自动更新自己。----这里的主题对象就是被观察者   2.代码模拟      抽象主题角色AbstractWatched.java    public interface AbstractWatched { Java代码

hjf19790118的专栏 308

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1491

设计模式学习(二)-- 观察者模式 Observer Pattern

观察者模式:定义了对象之间的一对多依赖,这样当一个对象状态改变的时候,它的所有依赖者都会收到通知并自动更新。设计原则:为了交互对象之间的松耦合设计而努力。 松耦合的设计让对象之间的依赖降到最低,这样便于建立更加有弹性的系统,应对变化。实现观察者模式的方法不止一种,但是包含Subject和Observer接口的设计实现最常见。主题只需要知道观察者实现了观察者接口Observer,不需要知道观察者的具

isskingdom的专栏 502

Ardupilot chibios IO固件,IO与FMU通信,固件下载(3)

目录 文章目录目录摘要 摘要 本节主要记录自己学习IO与FMU通信

陌城烟雨 2798

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

设计模式学习(二)观察者模式

设计模式学习(二)观察者模式观察者模式定义设计原则举例 本文是阅读《Head First 设计模式》的学习记录。详细内容可以自行阅读书本 观察者模式 定义   定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖着都会收到通知并自动更新。 设计原则   1.为了交互对象之间的松耦合设计而努力。 举例   当气象站的数据发生改变时,需要通知展示板进行数据更新。三个展示板通过订阅气...

qq_37149418的博客 183

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

设计模式学习(二)之观察者模式

报纸和杂志的订阅是怎么一回事? 1.报社的业务就是出版报纸 2.向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来,只要你是他们的订户,你就会一直收到新报纸 3.当你不想在看报纸的时候,取消订阅,他们就不会再送新报纸来 4.只要报社还在运营,就会一直有人向他们订阅报纸或取消报纸 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知

qq_15914047的博客 319

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java学习设计模式二:观察者模式

观察者模式(Observer Pattern)是一种常见的设计模式,其定义是:定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。该模式又称为发布-订阅模式(Publish/Subscribe Pattern)或者消息机制(Message Pattern)。

qq_42822006的博客 134

设计模式系列学习(二):观察者模式

设计模式的观察者模式,致力于降低交互对象间的耦合,实现一对多的通信关系。

ayugezhoubing的博客 565

设计模式学习(二)——观察者模式

一、引言 什么是观察者模式呢?其实生活中很常见:报社出版报纸,并定期向订阅用户推送报纸,用户可以订阅报纸和取消订阅。这个例子中可以看出观察者模式的主体有两个,即:出版者+订阅者,我们改个名称:出版者改为“主题”,订阅者改为“观察者”。 二、观察者模式 定义:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新 意图:定义对象间的一种一对...

weixin_30677617的博客 258

设计模式学习二:观察者模式

一.概念      在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。      观察者模式也被称之为:主题-观察者模式,发布-订阅模式,前者是一,后者是多。   二.UML Subject(主题类),最主要的方法:添加/删除观察者,改变状态,通知观察者。 Observer(观察者类),当主题状态改变,通知观察者时,触发观察者...

zy19982004的专栏 241

设计模式学习笔记(二:观察者模式)

1.1概述     在许多设计中,经常涉及多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化,在这样的情况下就可以使用观察者模式。     例如,某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想追踪“求职中心”中职业需求信息的变化。一位想知道“求职中心”职业需求信息变化的人需要成为“求职中心”的求职者,即让求职中心把自己登记到求职中心...

nimeimeidewen的专栏 323

设计模式学习二之观察者模式1

  观察者模式可谓是我们用的最多的模式之一了,如果开发过界面程序的话,各种监听事件,setOnClickListener(),设置点击的监听事件,这里就是一个观察者模式的应用了。观察者模式是什么呢?是一个一对多得依赖,一个主题,多个订阅者,就像报纸在报社和读者间的关系一样,读者通过给报社交钱告诉报社我需要你得报纸,报社分发报纸的时候,对所有交钱了得读者一一派发报纸。   怎么实现呢?如下是用接口...

weixin_33737774的博客 71

设计模式学习笔记②-观察者模式

观察者模式 定义:观察者模式定义了对象之间的一对多依赖,这样一来当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。     假如我们有一个报社,和一些客户。我是其中的一个客户,报社每当一有报纸要出版就会给所有订阅过报纸的客户进行送报。客户如果取消订报服务的话,报社就会将客户从订阅名单中删除,之后这个客户就不会再收到报纸了。 松耦合的威力   当两个对象之间松耦合,它们依然可以...

qq_31984717的博客 203

[学习][笔记]设计模式(基于C/C++实现)<二>观察者模式

观察者模式 定义 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。 观察对象的状态发生变化时,通知给观察者。 使用场景 观察者模式适用于根据对象状态进行相应处理的场景。 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们(Observer)订阅了某个人(Subject)的微博账号,当这个人发布(Action)了新的消息,就会通知(No

二次元怪兽的博客 499

设计模式学习系列之(二)观察者模式

设计模式学习系列之(二)观察者模式 观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新 大白话:其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 模式包含四个角色: 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用...

weixin_30609287的博客 65
上一篇: Mybatis 学习总结(八)——调用存储过程
下一篇: vsftpd配置文件详解
programer_bei
博客等级 码龄11年 13粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值