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

本文主要是介绍津津乐道设计模式 - 观察者模式详解(学会察言观色再也不怕女朋友生气了),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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 + "做出反应: 赶紧给她道歉");}}@Overridepublic 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

这篇关于津津乐道设计模式 - 观察者模式详解(学会察言观色再也不怕女朋友生气了)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/lhmyy521125/article/details/131395050
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/324356

相关文章

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

Spring Cache注解@Cacheable的九个属性详解

《SpringCache注解@Cacheable的九个属性详解》在@Cacheable注解的使用中,共有9个属性供我们来使用,这9个属性分别是:value、cacheNames、key、key... 目录1.value/cacheNames 属性2.key属性3.keyGeneratjavascriptor

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1