设计模式—行为型模式之观察者模式

news2024/11/15 21:22:30

设计模式—行为型模式之观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。这是一种对象行为型模式。

观察者模式有如下角色:

  • Subject: 目标

  • ConcreteSubject: 具体目标

  • Observer: 观察者

  • ConcreteObserver: 具体观察者

示例

比如现在大火的主播,可以直播卖货,直播卖货时可以通知给粉丝,结束卖货时也可以通知给粉丝。我们可以在主播中维护一个粉丝的列表,来进行通知。

代码如下:

/**
 * 抽象主播类
 */
public abstract class AbstarctAnchor {

    //添加粉丝
    abstract void addFans(AbstarctFans fans);

    //通知粉丝
    abstract void notifyFans(String msg);

}

/**
抽象粉丝类
 */
public abstract class AbstarctFans {

    //接收消息
    abstract void acceptMsg(String msg);

    //关注主播
    public void follow(AbstarctAnchor anchor){
        anchor.addFans(this);
    }
}

卖奥特曼的主播为:

/**
 * 卖奥特曼的主播
 */
@Slf4j
public class SellingUltramanAnchor extends AbstarctAnchor{

    //粉丝列表
    private List<AbstarctFans> fansList = new ArrayList<>();


    //卖奥特曼
    public void selling(){
        log.info("我是卖奥特曼的主播,我来卖奥特曼了....");
        //通知粉丝
        notifyFans("主播来卖货了");
    }

    //结束卖奥特曼
    public void end(){
        log.info("奥特曼卖没了....");
        //通知粉丝
        notifyFans("主播结束卖货了");
    }

    @Override
    void addFans(AbstarctFans fans) {
        fansList.add(fans);
    }

    @Override
    void notifyFans(String msg) {
        //获取所有粉丝进行通知
        for (AbstarctFans abstarctFans : fansList) {
            abstarctFans.acceptMsg(msg);
        }
    }
}

忠实粉丝和黑粉类如下

/**
 * 忠实粉丝
 */
@Slf4j
public class LoyalFans extends AbstarctFans{
    @Override
    void acceptMsg(String msg) {
        log.info("卖奥特曼的主播来了,他说:"+msg);
    }
}
/**
 * 黑粉
 */
@Slf4j
public class AntiFan extends AbstarctFans{
    @Override
    void acceptMsg(String msg) {
        log.info("这个卖奥特曼的主播卖的奥特曼不会发光,别买!!!");
    }
}

测试类如下

public class ObserverTest {
    public static void main(String[] args) {
        //卖奥特曼的主播对象
        SellingUltramanAnchor anchor = new SellingUltramanAnchor();
        //忠实粉丝1
        AbstarctFans loyalFans1 = new LoyalFans();
        loyalFans1.follow(anchor);
        //忠实粉丝2
        AbstarctFans loyalFans2 = new LoyalFans();
        loyalFans2.follow(anchor);

        //黑粉
        AbstarctFans antiFan = new AntiFan();
        antiFan.follow(anchor);

        //开播
        anchor.selling();
        //结束直播
        anchor.end();
    }
}

运行结果如下:

运行截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三.Winform使用Webview2加载本地HTML页面

Winform使用Webview2加载本地HTML页面 往期目录创建Demo2界面创建HTML页面在Demo2窗体上添加WebView2和按钮加载HTML查看效果 往期目录 往期相关文章目录 专栏目录 创建Demo2界面 经过前面两小节 一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定…

同星多通道CAN FD转USB/WIFI设备,解决近距离无线通讯问题

新品发布/New products release 2024年1月&#xff0c;同星智能连续发布FlexRay系列产品TP1034和以太网系列产品TP1051&#xff0c;上周发布多通道总线记录仪产品TLog1004。1月19日&#xff0c;同星智能又推出一款2/4路CAN FD转USB和WIFI的工具&#xff0c;解决近距离无线通讯…

L1-079 天梯赛的善良(Java)

天梯赛是个善良的比赛。善良的命题组希望将题目难度控制在一个范围内&#xff0c;使得每个参赛的学生都有能做出来的题目&#xff0c;并且最厉害的学生也要非常努力才有可能得到高分。 于是命题组首先将编程能力划分成了 106 个等级&#xff08;太疯狂了&#xff0c;这是假的&…

如何使用支付宝沙箱环境本地配置模拟支付并结合内网穿透远程调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

基于光口的以太网 udp 回环实验

文章目录 前言一、系统框架整体设计二、系统工程及 IP 创建三、UDP回环模块修改说明四、接口讲解五、顶层模块设计六、下载验证前言 本章实验我们通过网络调试助手发送数据给 FPGA,FPGA通过光口接收数据并将数据使用 UDP 协议发送给电脑。 提示:任何文章不要过度深思!万事万…

【SpringBoot技术专题】「开发实战系列」Undertow web容器的入门实战及调优方案精讲

Undertow web容器的入门实战及调优方案精讲 Undertow web容器Undertow 介绍官网API给出一句话概述Undertow&#xff1a;官网API总结特点&#xff1a;Lightweight&#xff08;轻量级&#xff09;HTTP Upgrade Support&#xff08;支持http升级&#xff09;、HTTP/2 Support支持H…

浅谈linux中的根文件系统(rootfs的原理和介绍)【转】

浅谈linux中的根文件系统&#xff08;rootfs的原理和介绍&#xff09;【转】 转自&#xff1a;https://www.cnblogs.com/sky-heaven/p/13742173.html linux中有一个让不少初学者都不是特别清楚的概念&#xff0c;叫作“根文件系统”。我接触linux前先后后也好几年了&#xff0…

Hystrix-熔断机制

1.1. 雪崩效应 熔断发生在服务端&#xff0c;降级发生在客户端&#xff1b; 分布式系统环境下&#xff0c;服务间类似依赖非常常见&#xff0c;一个业务调用通常依赖多个基础服务。如下图&#xff0c;对于同步调用&#xff0c;当库存服务不可用时&#xff0c;商品服务请求线程…

使用pysimplegui+opencv编写一个摄像头的播放器

需求 使用pysimplegui和opencv实现一个播放器&#xff0c;播放 摄像头的画面。 代码实现 import cv2 import time from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: i…

【英文干货】【Word_Search】找单词游戏(第1天)

本期主题&#xff1a;Mindfulness&#xff08;意识力&#xff09; 本期单词&#xff1a; Awareness 意识 Breathing 呼吸 Calm 平静的 De-Stress 减压 Feelings 感受&#xff0c;情感 Inspection 调查 Meditation 冥想 Peace 和平 Quiet 安静的 Recollection 回忆 R…

深入理解java对象的内存布局

概述&#xff1a; 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头&#xff08;Header&#xff09;、实例数据&#xff08;Instance Data&#xff09;和对齐填充&#xff08;Padding&#xff09;。 在HotSpot虚拟机里&#xff0c;…

网络安全全栈培训笔记(57-服务攻防-应用协议RsyncSSHRDPFTP漏洞批量扫描口令拆解)

第57天 服务攻防-应用协议&Rsync&SSH&RDP&FTP&漏洞批量扫描&口令拆解 知识点&#xff1a; 1、服务攻防-远程控制&文件传输等 2、远程控制-RDP&RDP&弱口令&漏洞 3、文件传输-FTP&Rsyc&弱口令&漏洞 章节内容&#xff1a;…

vmware 安装Rocky-9.3系统

安装系统截图 安装完成&#xff0c;启动 查看版本和内核 开启远程登陆授权 1、编辑配置文件 #提升权限&#xff0c;输入su,并输入密码 su #编辑ssh文件开启root远程登陆 vi /etc/ssh/sshd_config找到以下内容&#xff1a;#PermitRootLogin prohibit-password 添加&#xff1a…

13个常见的 WordPress 块编辑器问题以及如何修复它们

您在使用 WordPress 块编辑器时遇到过错误吗&#xff1f; WordPress 在 2019 年用名为 Gutenberg 的全新内容编辑器取代了旧的经典编辑器。该编辑器使用块在 WordPress 中创建内容。然而&#xff0c;有时&#xff0c;在使用它时可能会遇到恼人的问题。 在本文中&#xff0c;我…

知识图谱的广泛应用与价值

目录 前言1 语义搜索2 知识问答2.1 问答对的深度关联2.2 文本挖掘与答案精准性2.3 知识图谱问答的全面服务 3 辅助推荐4 辅助大数据分析4.1 知识图谱推理的应用4.2 知识图谱的数据分析4.3 动态本体技术的引入 5 故障诊断5.1 故障诊断系统的应用5.2 知识图谱在语言理解中的作用5…

【Android12】Android Framework系列---Adb和PMS安装apk源码流程

Adb和PMS安装apk源码流程 adb install命令 通过adb install命令可以将apk安装到Android系统&#xff08;注意&#xff1a;特定类型的apk&#xff0c;比如persist类型是无法通过adb安装的&#xff09; 下述命令中adb解析install命令&#xff0c;并调用Android PackageManagerS…

S2-08 ESP-IDF开发 : 存储

S2-06 和 S2-07 暂时先不发&#xff0c;课上没给同学们将&#xff0c;分别是 DMA 和 USB 章节&#xff0c;作为专项讲 存储 ESP32 系列芯片中&#xff0c;不同型号的芯片所携带的 ROM、SRAM、RCT SRAM、PSRAM 以及 Flash大小不同&#xff0c;他们的作用如下&#xff1a; SRAM…

centos 启动nacos pg版本

背景&#xff1a;支持国产化需求&#xff0c;不再使用mysql 1.修改插件 git clone https://github.com/wuchubuzai2018/nacos-datasource-extend-plugins.git cd nacos-datasource-extend-plugins/nacos-postgresql-datasource-plugin-ext mvn package编译成功后&#xff0c;…

虚拟机将1.15版本的nginx推送到阿里云镜像仓库

1、docker images 2、docker login --usernamealiyun7279061146 registry.cn-shenzhen.aliyuncs.com 3、docker tag 53f3fd8007f7 registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15 docker push registry.cn-shenzhen.aliyuncs.com/zhouwb/zhou:1.15

C++实战:类的包含编译模型

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;C普通类的包含编译模型1、创建普通类定义文件2、创建普通类实现文件3、创建主程序文件4、运行主程序&#xff0c;查看结果 &#xff08;二&#xff09;C模板类的包含编译模型1、创建模板类定义文件2、创建模板类实…