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设计模式-观察者模式学习
最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...
随机推荐
- Git Bash OpenSSL – Generate Self Signed Certificate
前言 以前就写过了, 只是写的太乱, 这篇是一个整理版. 以前的文章: Git Bash 创建证书 PowerShell 创建证书 我已经没有用 PowerSheel 做证书了, 所以就不介绍了. 参 ...
- 教你一招,测试人员如何通过AI提高工作效率!
伴随着AI技术的兴起,像OpenAI推出的ChatGPT.Microsoft发布的Microsoft 365 Copilot.阿里的通义千问.百度的文心一言.华为的盘古大模型等.很多测试人员开始担心, ...
- IT男如何走上的自由职业之路。
前言 在博客园的一篇文章<40岁大龄失业程序猿,未来该何去何从>,在下面留言,目前自己在做自由职业,很多人加好友咨询自由职业的事情,对IT行业自由职业比较感兴趣,问怎么能走上这条路,所以才 ...
- 致敬传奇 Kruskal 重构树题硬控我三小时
NOI2018 归程 存边的数组拿来干两件事,忘了清空了,其实最好开两个的 dfs 没开 vis 导致不知道为什么出现的绕圈 倍增的 fa[i][j] 定义的时候前面是 \(2^{i}\) 写着写着记 ...
- Spark集群的安装及高可用配置
spark官网学习文档 Spark集群的安装及高可用配置 前期需求:Hadoop和Scala必须已经安装完成 步骤: ①进入spark下载网站中https://spark.apache.org/dow ...
- 【赵渝强老师】Oracle存储过程中的out参数
一.什么是存储过程 Oracle存储过程可以说是一个记录集吧,它是由一些PL/SQL语句组成的代码块,这些PL/SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取 ...
- 数据库故障处理优质文章汇总(含Oracle、MySQL、MogDB等)
数据库告警.紧急问题处理这些项目对于大多数朋友来讲应该不陌生了.从墨天轮社区整理的"最受DBA欢迎的技术文档合辑"系列中可以发现,大家对"故障诊断专题"的热情居 ...
- iOS上架App Store使用小结
1.安装iOS上架辅助软件Appuploader 2.申请iOS发布证书(p12) 3.申请iOS发布描述文件(mobileprovision) 4.打包ipa 5.上传ipa到iTunes Conn ...
- 在 Vue 实例中编写生命周期hook 或者其它 option/propertie 时,为什么不适用箭头函数 ?
首先,箭头函数没有自己的 this 环境变量 会沿用作用域使用父级this : 由Vue 管理的函数 ,如果写成箭头函数 this 就不在是 Vue 实例 了 :
- Ex-BSGS
给定\(a,p,b\),求\(a^x\equiv b \pmod p\)的最小自然数\(x\) . 保证\(\sum \sqrt p \leq5\times 10^6\) 当\(a=p=b=0\)时, ...