津津乐道设计模式 - 观察者模式详解(学会察言观色再也不怕女朋友生气了)

news2024/11/22 11:50:28

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 观察者模式详解

  • 什么是观察者模式
  • 观察者模式适用场景
  • 生活案例
  • 案例代码
  • 观察者模式优缺点
  • 结语

什么是观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新

在观察者模式中,存在两个主要角色:

Subject(主题):也称为被观察者或可观察者,它维护了一组观察者,并提供了用于添加、删除和通知观察者的方法。当其状态发生变化时,会通知所有观察者。

Observer(观察者):也称为订阅者或监听者,它定义了一个更新接口,用于接收主题的通知。当观察者接收到通知时,可以执行相应的操作。

观察者模式适用场景

观察者模式适用于以下场景:

  • 当一个对象的改变需要同时通知其他对象,并且你不知道有多少对象需要被通知时,可以使用观察者模式。它将这种一对多的依赖关系进行了解耦,使得主题对象和观察者对象之间松耦合。

  • 当一个对象的改变需要触发其他对象的特定行为时,可以使用观察者模式。观察者可以根据主题对象的状态变化来执行相应的操作,实现了对象之间的交互和协作。

  • 当应用中的某个对象需要与多个其他对象进行交互,但又希望避免紧密耦合时,可以使用观察者模式。观察者模式使得主题对象和观察者对象之间只依赖于抽象接口,减少了对象间的直接依赖,提高了系统的灵活性和可扩展性。

观察者模式通过定义一对多的依赖关系,实现了对象间的松耦合和动态通知机制。它提供了一种简洁的方式来实现对象间的交互和协作,使得系统更加灵活、可扩展和易于维护。观察者模式在事件驱动、GUI开发、消息传递和订阅发布系统等领域广泛应用,比如微信消息动态通知、邮件通知、广播通知等。

生活案例

现实生活中,你会发现你的女朋友心思很难猜透,你是不是也经常遇到这样的情况:

  • 她有时候说:不想要(其实她想要)
  • 她有时候说:我没生气(实际上心里已经气鼓鼓的)
  • 她有时候说:我走吧 不用管我了(你敢走 老娘跟你没完)
  • 她有时候说:怎么可能是你的错,都是我的错(老娘怎么会犯错,再不跟我道歉,立马叫你好看)

诸多种种,是不是让你莫名其妙,毫无招架之力?那么跟着博主学会了本章观察者模式让你学会察言观色再也不怕女朋友生气了,哈哈哈~

案例代码

假设你想了解你的女朋友的情绪状态,并根据她的表情和言辞来判断她的心情。现在我们使用观察者模式来设计这个场景

首先,我们定义一个观察者接口,表示观察者:

public interface Observer {
    void update(String expression, String words);
}

然后,我们定义一个主题类,表示你的女朋友:

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

public class Girlfriend {
    private List<Observer> observers = new ArrayList<>();
    private String expression;
    private String words;

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void setMood(String expression, String words) {
        this.expression = expression;
        this.words = words;
        notifyObservers();
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(expression, words);
        }
    }
}

接下来,我们定义具体观察者类,表示你:

public class You implements Observer {
    private String name;

    public You(String name) {
        this.name = name;
    }

    //举例根据女友言语做出的反应
    public void doSomething(String words){
        if(words.equals("太贵了我不想要")){
            System.out.println(name + "做出反应: 赶紧给她买");
        }
        if(words.equals("怎么可能是你的错,都是我的错!")){
            System.out.println(name + "做出反应: 赶紧给她道歉");
        }
    }

    @Override
    public void update(String expression, String words) {
        System.out.println(name + "观察到: 她的表情是" + expression + ",她说:" + words);
        doSomething(words);
    }
}

现在,我们可以使用观察者模式来模拟观察女朋友的情绪变化,例如:

public class ObserverPatternTest {
    public static void main(String[] args) {
        Girlfriend girlfriend = new Girlfriend();

        You you1 = new You("小明");

        girlfriend.addObserver(you1);

        girlfriend.setMood("开心", "太贵了我不想要");
        girlfriend.setMood("生气", "怎么可能是你的错,都是我的错!");
    }
}

结果输出如下:
在这里插入图片描述
通过观察者模式,当你的女朋友的情绪发生变化时,你作为观察者会立即收到通知,并根据她的表情和言辞来了解她的心情状态。这样,你就可以及时做出相应的回应和关心。

观察者模式优缺点

观察者模式的优点

  • 解耦性:观察者模式可以将观察者和被观察者之间的关系解耦,使它们可以独立地进行修改和扩展,互不影响。
  • 扩展性:通过添加新的观察者,可以方便地扩展系统功能,而无需修改原有的代码。
  • 可重用性:观察者模式可以将观察者和被观察者进行分离,使它们可以被其他模块复用。
  • 灵活性:观察者模式允许观察者根据需要订阅和取消订阅被观察者的通知,从而实现动态的观察者列表。

观察者模式的缺点

  • 增加了复杂性:引入观察者模式会增加系统的复杂性,因为观察者和被观察者之间需要建立关联关系,并且观察者之间也可能存在相互依赖的关系。
  • 内存泄漏风险:如果观察者没有被正确地移除或管理,可能会导致内存泄漏问题。
  • 通知顺序问题:观察者模式中,观察者的通知顺序可能是不确定的,这对某些特定场景下可能会造成影响。

需要根据具体的应用场景和系统需求来权衡观察者模式的优缺点,并选择合适的设计模式。

结语

本章节主要讲解观察者模式应用场景、观察者模式优缺点,并以生活中女朋友情绪、语言的案例,结合观察者模式了解她的心情状态,迅速做出相应的回应和关心,再也不怕女朋友生气了。如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

样例代码:https://github.com/lhmyy521125/toher-designmode

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

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

相关文章

Nginx 优化配置及详细注释~转

Nginx 优化配置及详细注释 转https://www.cnblogs.com/taiyonghai/p/5610112.html Nginx 的nginx.conf文件&#xff0c;是调优后的&#xff0c;具体影响已经写清楚注释&#xff0c;可以拿来用&#xff0c;有一些设置无效&#xff0c;我备注上了&#xff0c;不知道是不是版本的…

《kafka 核心技术与实战》课程学习笔记(七)

生产者压缩算法 怎么压缩&#xff1f; 压缩&#xff08;compression&#xff09;秉承了用时间去换空间的经典 trade-off 思想&#xff0c;具体来说就是用 CPU 时间去换磁盘空间或网络 I/O 传输量&#xff0c;希望以较小的 CPU 开销带来更少的磁盘占用或更少的网络 I/O 传输。…

初识mysql数据库之基础操作

目录 一、库的操作 1. 创建数据库 2. 数据库的编码集 2.1 数据库的编码问题 2.2 查看系统默认字符集和校验规则 2.3 创建数据库时指定字符集和校验集 2.4 校验规则对数据库的影响 3. 进入数据库 4. 确认自己当前所处的数据库 5. 修改数据库的编码集 6. 查看创建数据…

FPGA解码MIPI视频 OV5647 2line CSI2 720P分辨率采集 提供工程源码和技术支持

目录 1、前言2、Xilinx官方主推的MIPI解码方案3、本 MIPI CSI2 模块性能及其优越性4、我这里已有的 MIPI 编解码方案5、详细设计方案6、vivado工程介绍7、上板调试验证8、福利&#xff1a;工程代码的获取 1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI…

现代民机“飞行管理系统(FMS)”的功能和组成

01 什么是 “飞行管理系统”&#xff1f; 飞行管理系统&#xff08;FMS, Flight Management System&#xff09;&#xff0c;中文简称 “飞管”&#xff0c;是飞机航电系统的重要一员。 FMS 自 20 世纪 70 年代诞生以来&#xff0c;目前已有了跨越式发展。它作为航电关键系统&…

100种思维模型之质量控制理论思维模型-83

质量控制理论思维模型&#xff0c;又叫做戴明环思维模型&#xff0c;即PDCA循环思维模型。 在上世纪50年代&#xff0c;日本的商品和今天中国的商品一样&#xff0c;都是低质低价的代表&#xff0c;后来日本引入了戴明博士的质量控制理论&#xff0c;即PDCA循环理论&#xff0…

浅谈无线测温系统在高压开关柜中的应用

关注acrelzxz&#xff0c;了解更多详情 摘要&#xff1a;高压开关柜是配电系统中重要的组成部分&#xff0c;其主要作用是控制电荷、分配电能和开断电流等&#xff0c;对维持系统的稳定性有一定的保障作用。将无线测温技术应用于高压开关柜&#xff0c;可以实现对其进行实时的…

汽车芯片,竞逐新周期

在过去几年&#xff0c;SoC几乎成了智能汽车行业皇冠上的明珠。汽车芯片从通用型、分散化的单一功能芯片&#xff08;MCU&#xff09;快速转向集成化的多功能SoC&#xff08;System on Chip&#xff09;芯片。 比如&#xff0c;在智能座舱领域&#xff0c;CPU算力用于提高任务处…

国产chatgpt:基于chatGLM微调nlp分类任务

文章目录 一、源码网址1. 硬件设施&#xff1a;2. INT4 量化示例 二、重要的开源社区功能&#xff1a;网址&#xff1a;使用方法&#xff1a;利用方法&#xff1a;对 NLP 工作者的作用&#xff1a;对大模型工程师的用处&#xff1a; 三、重要的开源库四、提示词工程五、进行分类…

优思学院|精益生产管理七大要素

精益生产是一种有效的管理方法&#xff0c;通过优化生产流程和资源利用&#xff0c;帮助企业提高效率、降低成本&#xff0c;并最大程度地满足客户需求。在精益生产中&#xff0c;有七个关键的管理要素&#xff0c;它们分别是人员、资金、方法、机器设备、物料、市场及士气。 1…

避坑指南!一文帮您解决Jmeter录制chrome操作过程中遇到的问题!

Jmeter录制脚本原理 脚本录制时&#xff0c;Jmeter作为代理网关&#xff0c;通过监听某个端口&#xff0c;来捕获监听端口的报文信息&#xff0c;对抓取到的请求信息和响应信息进行转换为对应的行为函数。我们这里以设置chrome代理为例&#xff0c;然后使用jmeter进行脚本录制…

【方法】ZIP分卷压缩文件如何解压?

有时候文件太大&#xff0c;我们在压缩ZIP文件时会使用分卷压缩。 那后期想要解压ZIP分卷文件&#xff0c;要如何解压呢&#xff1f;不清楚的小伙伴&#xff0c;可以跟着小编来看看哦。 在解压ZIP分卷压缩文件之前&#xff0c;要先确保所有的分卷压缩包都存放在一个文件夹里&…

HTML5的新特性有哪些?

HTML5是近年来Web开发标准最巨大的飞跃。与以前的版本不同&#xff0c;HTML5并非仅仅用来表示Web内容&#xff0c;它的新使命是将Web带入一个成熟的应用平台&#xff0c;在HTML5平台上&#xff0c;视频、音频、图像、动画&#xff0c;以及同计算机的交互都被标准化。 HTML5在以…

大厂可能会问的那些思维题和技术点

精选大厂可能会问的那些思维题和技术点 一、题目一1.1、思路&#xff1a;1.2、代码实现 二、题目二三、const 的含义及实现机制, ,比如 : const int i, 是怎么做到 i 只可读的? ?四、到商店里买 200 的商品返还 100 优惠券( ( 可以在本商店代替现金) ) 。请问实际上折扣是多少…

6-js基础-4

JavaScript 基础 - 4 理解封装的意义&#xff0c;能够通过函数的声明实现逻辑的封装&#xff0c;知道对象数据类型的特征&#xff0c;结合数学对象实现简单计算功能。 函数综合案例 函数 理解函数的封装特性&#xff0c;掌握函数的语法规则 函数的基本使用 函数: 是可以被重复…

JavaScript的for循环学不明白怎么办?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言for循环的基本语法…

Apikit 自学日记:自动生成 API 文档

功能入口&#xff1a;API管理应用 / 选中某个项目 / 其他菜单 / 数据源同步&#xff08;API文档自动生成&#xff09; 该功能可通过配置数据源信息&#xff0c;实现基于数据源的API信息自动生成API文档。 当前支持5种数据源&#xff1a;Swagger URL、apiDoc、Github、gitlab、…

【FPGA零基础学习之旅#9】状态机基础知识

&#x1f389;欢迎来到FPGA专栏~状态机基础知识 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

MAC电脑使用技巧

Mac打开根目录 /user下的文件 mac 上怎么显示隐藏的/user文件夹&#xff0c;有两种方法可选~~~ 1&#xff0c;Finder界面是&#xff0c;最上方&#xff0c;通过“前往”进入“电脑”或文件夹 先进入到需要显示隐藏文件的文件夹下 接着按Command苹果键F,在窗格上会显示搜索栏 然…

爬虫框架和库有多重要?

爬虫框架和库在网络数据提取和分析中非常重它们为开发人员提供了工具和功能&#xff0c;使他们能够更轻松地从互联网上抓取数据。爬虫框架和库通常提供了高效的网络请求、数据解析和存储机制&#xff0c;简化了爬取过程。 使用爬虫框架库有以下几个重要优势&#xff1a; 快速开…