设计模式之观察者模式

Java39

观察者模式是极其重要的一个设计模式,也是我几年开发过程中使用最多的设计模式,本文首先概述观察者模式的基本概念和Demo实现,接着是观察者模式在Java和Spring中的应用,最后是对观察者模式的应用场景和优缺点进行总结。

一、概念理解

观察者模式:定义对象之间的一对多依赖关系,以便每当对象的状态发生变化时,其相关的依赖对象都可以被自动通知和更新。主要用于多个不同的对象会对一个对象的方法做出不同的反应!

[En]

Observer pattern: defines an one-to-many dependency between objects, so that whenever the state of an object changes, its related dependent objects can be notified and updated automatically. Mainly used for multiple different objects will react differently to a method of an object!

概念啥意思呢?也就是说,如果使用观察者模式在A的业务逻辑中调用B的业务逻辑,即使B的业务逻辑报错了,仍然不影响A的执行。

例如,最近在我公司开发商城系统的过程中,提交订单成功后,我不得不删除购物车中的信息。如果我先写订单提交逻辑,然后再写删除购物车逻辑,当然没有问题,但程序的健壮性太差了。

[En]

For example, in the process of developing the mall system in my company recently, I had to delete the information in the shopping cart after submitting the order successfully. If I first wrote the order submission logic, and then wrote the delete shopping cart logic, of course, there was no problem, but the robustness of the program was too poor.

业务应该分为两个步骤,一个是处理订单成功的处理逻辑,另一个是删除购物车中的信息。即使在删除购物车时报告错误,提交订单的逻辑仍然不影响。

[En]

The business should be divided into two steps, one is to process the order successful processing logic, and the other is to delete the information in the shopping cart. Even if an error is reported when deleting the shopping cart, the logic of submitting the order still does not affect.

那应该怎么做才能让他们互不影响呢?需要在购物车对象中要有一个方法用于删除购物车,还要有一个对象A用于注入(add)购物车对象和通知(notify)购物车执行它的方法。

在执行时先调用对象A的add方法将购物车对象添加到对象A中,在订单提交成功以后,调用对象A的通知notify购物车方法执行清除购物车逻辑。

在观察者模式中,购物车就称为观察者,对象A就称为目标对象。在面向接口编程原则下,观察者模式应该包括四个角色:

1、目标接口(subject) :它是一个抽象类,也是所有目标对象的父类。它用一个列表记录当前目标对象有哪些观察者对象,并提供增加、删除观察者对象和通知观察者对象的方法声明。

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
Java

MyBatis 结果映射总结

前言 结果映射指的是将数据表中的字段与实体类中的属性关联起来,这样 MyBatis 就可以根据查询到的数据来填充实体对象的属性,帮助我们完成赋值操作。其实 MyBatis 的官方文档对映射规则的讲解还...
Java

每日一题(2022-5-24):经典搜索算法

题目 给定一个文件目录的路径,统计这个目录下所有的文件数并返回 分析 这个问题很容易想到深度搜索或广泛搜索。它不仅检查搜索算法的应用,而且检查文件的操作。这个问题在面试中很常见[En]This que...
Java

如何下载 blob 地址的视频资源

如何下载视频资源以blob:http开头的资源 一、问题场景 想下载知乎视频资源,却发现视频链接是这个样子的 blob:https://v.vzuu.com/b6146956-6e52-406d-89...
Java

python 类与对象

如果需创建一个类,那么可以使用 class 关键字: 实例 使用名为 a 的属性,创建一个名为 MyClass 的类: class MyClass: a = 6 现在我们可以使用名为 myClass ...
Java

CentOS7 怎么解决连网问题

CentOS7 怎么解决连网问题 VmWare安装centos7无法上网怎么办?下面为大家分享了解决方法,供大家参考,具体内容如下 1.关闭防火墙 systemctl stop firewalld.s...
Java

IDEA的超好体验用法

日常使用Java开发都使用Idea,最近发现一个体验非常好的用法,即开启Presentation Mode 开启 Presentation Mode 入口 View->Appearance-&g...
Java

Java(5)输入与输出

读取输入 要想通过控制台进行输入,首先需要构造一个与"标准输入流" System.in关联的Scanner对象。 // 创建输&...