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

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

在这里插入图片描述

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

相关文章

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原