Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
背景事件:近日,优衣库宣布不再使用新疆棉花,这一举措引发了广泛的社会讨论。消费者的反应和舆论的压力,让优衣库的决策迅速影响了市场和品牌形象。类似的,许多系统也面临着需要根据外部事件或状态的变化,做出即时反应的需求。
在软件设计中,观察者模式(Observer Pattern) 就是为了处理这种“状态变化与反应”的需求。它允许一个对象(主题)发生变化时,通知所有依赖它的对象(观察者),而不需要显式的调用,即松耦合地处理不同模块间的动态更新。
今天,我们将结合优衣库棉花事件,来讲解如何使用 观察者模式 来应对复杂业务中的事件驱动响应。
一、观察者模式概述
1.1 观察者模式的定义
观察者模式属于行为型设计模式,其核心思想是:当对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。这种模式非常适用于当系统中的某一部分状态变化需要同时通知到其他部分的场景。
1.2 观察者模式的组成部分
- 主题(Subject):状态变化的核心对象,负责管理所有的观察者并通知它们。
- 观察者(Observer):依赖于主题对象的变化,并作出响应。
- 通知机制:通过注册和触发通知,观察者获得主题对象的状态变化。
在 优衣库不使用新疆棉 的事件中,品牌决策就像主题对象,而消费者、舆论、媒体等就是观察者。每当品牌作出决策,消费者的情感、舆论的反应都会发生变化,观察者(消费者)的情绪或行为会随之改变。
二、观察者模式与优衣库事件的类比
2.1 事件背景
假设优衣库公司决定不再使用新疆棉,这一决策会触发不同的消费者、股东、媒体等不同的观察者产生反应:
- 消费者可能对这一举措产生负面或正面的情绪,甚至会改变购买行为。
- 媒体可能会通过报道引导舆论。
- 股东可能对这一决策的影响做出反应,调整投资策略。
这些变化是动态的,且每当优衣库做出决策时,所有相关的观察者(消费者、媒体等)都会收到通知并做出相应反应。
2.2 在系统设计中的应用
在类似的业务场景中,观察者模式非常有用。通过观察者模式,当主题(如优衣库品牌决策)发生变化时,所有需要响应变化的组件(如消费者、舆论)都会自动收到通知并执行相应的处理逻辑。这种设计使得不同的模块之间保持了松耦合的关系,不需要主题对象知道观察者的具体细节。
三、观察者模式的实现
接下来,我们通过代码来实现一个基于观察者模式的简单示例,模拟优衣库品牌决策引发的消费者反应。
3.1 代码示例:实现观察者模式
// 主题类:优衣库品牌决策
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface BrandDecision {
void addObserver(ConsumerObserver observer);
void removeObserver(ConsumerObserver observer);
void notifyObservers();
}
// 具体主题:优衣库的品牌决策
class UniqloBrandDecision implements BrandDecision {
private List<ConsumerObserver> observers = new ArrayList<>();
private String decision;
@Override
public void addObserver(ConsumerObserver observer) {
observers.add(observer);
}
@Override
public void removeObserver(ConsumerObserver observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (ConsumerObserver observer : observers) {
observer.update(decision);
}
}
public void makeDecision(String decision) {
this.decision = decision;
System.out.println("优衣库品牌做出决策: " + decision);
notifyObservers();
}
}
// 观察者接口:消费者反应
interface ConsumerObserver {
void update(String decision);
}
// 具体观察者:消费者
class Consumer implements ConsumerObserver {
private String name;
public Consumer(String name) {
this.name = name;
}
@Override
public void update(String decision) {
System.out.println(name + " 收到决策通知,决定如何行动: " + decision);
if (decision.contains("不使用新疆棉")) {
System.out.println(name + " 表示失望,可能不再购买!");
} else {
System.out.println(name + " 觉得决策不错,继续购买!");
}
}
}
3.2 代码分析
在上面的代码中:
- UniqloBrandDecision 类是主题,它包含了消费者的观察者列表。当优衣库作出决策时,会调用
makeDecision()
方法,通知所有的观察者(消费者)进行反应。 - Consumer 类是具体的观察者,当品牌决策改变时,它会根据决策内容做出不同的反应。
3.3 客户端代码:模拟消费者反应
public class ObserverPatternExample {
public static void main(String[] args) {
// 创建品牌决策主题
UniqloBrandDecision uniqloDecision = new UniqloBrandDecision();
// 创建消费者观察者
Consumer consumer1 = new Consumer("消费者A");
Consumer consumer2 = new Consumer("消费者B");
// 消费者注册到品牌决策
uniqloDecision.addObserver(consumer1);
uniqloDecision.addObserver(consumer2);
// 优衣库做出决策
uniqloDecision.makeDecision("优衣库决定不再使用新疆棉,改用其他地区棉花");
// 优衣库做出新的决策
uniqloDecision.makeDecision("优衣库决定继续使用新疆棉");
}
}
3.4 输出结果
优衣库品牌做出决策: 优衣库决定不再使用新疆棉,改用其他地区棉花
消费者A 收到决策通知,决定如何行动: 优衣库决定不再使用新疆棉,改用其他地区棉花
消费者A 表示失望,可能不再购买!
消费者B 收到决策通知,决定如何行动: 优衣库决定不再使用新疆棉,改用其他地区棉花
消费者B 表示失望,可能不再购买!
优衣库品牌做出决策: 优衣库决定继续使用新疆棉
消费者A 收到决策通知,决定如何行动: 优衣库决定继续使用新疆棉
消费者A 觉得决策不错,继续购买!
消费者B 收到决策通知,决定如何行动: 优衣库决定继续使用新疆棉
消费者B 觉得决策不错,继续购买!
四、观察者模式的优势与应用
4.1 优点
- 松耦合:主题和观察者之间没有紧密的耦合关系。主题只知道它需要通知观察者,而不关心观察者的具体实现。
- 动态响应:观察者可以根据主题的状态变化动态调整自己的行为,非常适合事件驱动的系统。
- 易于扩展:添加新的观察者(如新消费者)非常方便,不需要改变现有的代码。
4.2 缺点
- 通知开销:如果观察者数量很多,通知机制可能会成为性能瓶颈。
- 依赖顺序:观察者的顺序可能影响到通知的处理流程,某些场景下可能需要额外的控制。
五、总结
通过优衣库不使用新疆棉事件,我们可以清晰地看到观察者模式在应对复杂决策和动态反应中的优势。当品牌作出决策时,消费者和舆论等多个观察者会收到通知并做出反应,无缝的事件驱动机制让这种决策的传播变得高效且灵活。
如果你的系统中涉及到多个模块需要对某一变化做出响应,观察者模式无疑是一个非常合适的解决方案。它能够帮助你保持系统的松耦合,快速响应变化,同时确保灵活的扩展性。
希望这篇文章能够帮助你理解如何通过观察者模式应对复杂的业务决策和系统响应!如果你对其他设计模式的应用感
作者:代老师的编程课
出处:https://zthinker.com/
如果你喜欢本文,请长按二维码,关注 Java码界探秘
.
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应的更多相关文章
- java设计模式--观察者模式(Observer)
java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...
- 【设计模式】Java设计模式 - 观察者模式
[设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...
- JAVA 设计模式 观察者模式
用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...
- Java设计模式——观察者模式(事件监听)
最近在看Tomcat和Spring的源码,在启动的时候注册了各种Listener,事件触发的时候就执行,这里就用到了设计模式中的观察者模式. 引-GUI中的事件监听 想想以前在学Java的GUI编程的 ...
- Java设计模式--观察者模式到监听器
观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...
- Java设计模式の观察者模式(推拉模型)
目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- Java设计模式 - 观察者模式
定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1. 主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...
- 我的Java设计模式-观察者模式
相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...
- java设计模式-观察者模式学习
最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...
随机推荐
- CSS – 屏幕, 打印, 分辨率, 物理像素, 逻辑像素, Retina, DPI, PPI 是什么?
前言 之前就有写过关于 Retina 和 Responsive Image 响应式图片 (responsive image) Retina 显示屏 但写的很烂, 这篇从新整理一下. 参考: 掌握web ...
- mongo查看服务状态
转载请注明出处: 查看数据库列表 show dbs 查看当前数据库 db 查看集合列表 show collections 查看数据库的状态 db.stats() 查看集合的状态 db.collecti ...
- react-pdf预览在线PDF的使用
1.在react项目中安装react-pdf依赖包 建议安装8.0.2版本的react-pdf,如果安装更高版本的可能出现一些浏览器的兼容性问题: npm install react-pdf@8.0. ...
- 理解IO多路复用
I/O 多路复用是什么? I/O 多路复用是用户程序通过复用一个线程来服务多个 I/O 事件的机制,我们也可以将他说成是一个线程服务多个文件描述符 fd,而 I/O 多路复用是在操作系统层面实现提供的 ...
- 【赵渝强老师】Kubernetes的探针
Kubernetes提供了探针(Probe)对容器的健康性进行检测.实际上我们不仅仅要对容器进行健康检测,还要对容器内布置的应用进行健康性检测. Probe有以下两种类型: livenessProbe ...
- USB协议详解第1讲(核心概念通俗理解)
0.概括 USB协议学习中最重要几个概念如下,没有提及的就是对USB协议学习中不重要的或者编程不需要用到的.大家也不用着急,概念必须要学会,否则都不知道下面这些东西是什么还学什么通用串行总线协议,大家 ...
- 2024年9月中国数据库排行榜:openGauss系多点开花,根社区优势明显
在墨天轮发布的9月中国数据库流行度排行榜中,中国数据库产业格局进一步聚集刷新,呈现出3大显著特征: 开源势力力争上游显优势领先潮流: openGauss 开源根社区优势明显: 阿里华为两极鼎立云上云下 ...
- C# 中的四种整形数据
// C# 中有四种整数类型 byte short int long byte bMax = byte.MaxValue; /// 255 最大值 byte bMin = byte.MinValue; ...
- Python 潮流周刊#72:Python 3.13.0 最终版已发布!(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- day08-数据类型拓展及面试题
数据类型拓展及面试题 整数拓展----进制 //整数拓展----进制 int i=10;//十进制 不能以0开头,0~9 int i1=0b11;//二进制:0 ...