背景事件:近日,优衣库宣布不再使用新疆棉花,这一举措引发了广泛的社会讨论。消费者的反应和舆论的压力,让优衣库的决策迅速影响了市场和品牌形象。类似的,许多系统也面临着需要根据外部事件或状态的变化,做出即时反应的需求。

在软件设计中,观察者模式(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 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应的更多相关文章

  1. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  2. 【设计模式】Java设计模式 - 观察者模式

    [设计模式]Java设计模式 - 观察者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 @一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长 ...

  3. JAVA 设计模式 观察者模式

    用途 观察者模式 (Observer) 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象. 这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 观 ...

  4. Java设计模式——观察者模式(事件监听)

    最近在看Tomcat和Spring的源码,在启动的时候注册了各种Listener,事件触发的时候就执行,这里就用到了设计模式中的观察者模式. 引-GUI中的事件监听 想想以前在学Java的GUI编程的 ...

  5. Java设计模式--观察者模式到监听器

    观察者模式是对象的行为模式.又叫做发布-订阅模式.模型-视图模式.源-监听器模式. 抽象主题角色:主题角色将所有对观察者对象的引用到保存在一个集合里,每个主题都可以拥有任意数量的观察者.抽象主题提供一 ...

  6. Java设计模式の观察者模式(推拉模型)

    目录: 一.观察者定义 二.观察者模式的结构(推模式实现) 三.推模型和拉模型(拉模式实现) 四.JAVA提供的对观察者模式的支持 五.使用JAVA对观察者模式的支持(自带推模式实现实例) 一.观察者 ...

  7. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  8. Java设计模式 - 观察者模式

    定义 观察者模式属于对象行为型模式. 在对象之间定义一对多的依赖,这样一来当一个对象改变状态,依赖它的对象都会收到通知并自动更新. 优点 1.  主题和观察者之间抽象耦合.无论什么对象主要实现了特定的 ...

  9. 我的Java设计模式-观察者模式

    相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...

  10. java设计模式-观察者模式学习

    最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别 ...

随机推荐

  1. Yarn 3.0 Plug'n'Play (PnP) 安装和迁移

    前言 以前用 npm, 后来 yarn 火了就用 yarn. 后来 yarn 2.0 大改版, Angular 不支持就一直没用. 一直到去年的 Angular 13 才开始支持. 最近又开始写 An ...

  2. tailwindcss 3.3.3(完成入门,需要补充每个单独样式)

    归纳 修饰符堆叠 <button class="dark:md:hover:bg-fuchsia-600"> 以下为修饰符 伪类伪元素 使用方法: 在实用程序类前添加h ...

  3. C++ STL list容器——链表

    list容器 简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成.每个节点包括两部分:一个是存储 ...

  4. QT6 Widgets深入剖析

    QT6 Widgets深入剖析 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费100 ...

  5. QT数据可视化框架编程实战之三维柱状图_补天云QT技术培训专家

    QT数据可视化框架编程实战之三维柱状图_补天云QT技术培训专家 文章目录 QT数据可视化框架编程实战:三维柱状图可视化运行效果 主程序实现C++代码 主场景 QML代码 坐标轴QML代码 数据模型定义 ...

  6. 大年初四,Flutter Forward 中国社区直播活动与你不见不散

    之前我们预告过,2023 年 1 月 25 日 (年初四),Flutter 团队将在肯尼亚首都内罗毕举办 Flutter Forward 大会,并同时开启线上直播.本次活动将为展示最新的 Flutte ...

  7. 修改Kubernetes主节点(控制节点)名称

    1.修改物理机主机名 hostnamectl set-hostname <hostname> 2.修改 /etc/kubernetes/manifests 目录下的文件,将文件内容包含旧主 ...

  8. .NET 代码混淆工具-JIEJIE.NET

    前言 JIEJIE.NET是一款强大的开源.NET程序集混淆工具.它利用深度加密技术和多样化的混淆策略,有效地保护了.NET软件的版权和源代码安全,防止未经授权的访问和篡改. 项目介绍 JIEJIE. ...

  9. 一个SMMU内存访问异常的问题

    最近碰到棘手的问题: 以太网进行iperf测试时, 发生了SMMU (System Memory Management Unit)访问异常导致内核崩溃. 原本只是内部测试发现, 后面在试验车上也概率性 ...

  10. 什么是 h5项目

    首先 h5项目不是 html5 的意思,在者 h5 不是微信网页 : h5 是移动网页的统称 :