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

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

在这里插入图片描述

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人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

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



http://www.chinasem.cn/article/324356

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1