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

在软件设计中,观察者模式(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. 音视频FAQ(二)视频直播延时高

    摘要 延时高是实时互动技术中常见的问题之一,解决延时高问题需要综合考虑网络.设备.编解码算法等多个因素.解决方案包括优化设备端延时.优化网络传输延时和使用UDP进行音视频传输等.在选择音视频传输协议时 ...

  2. RxJS 系列 – 目录

    请按顺序阅读 概念篇 Observable & Creation Operators Subject Observable to Subject (Hot, Cold, Warm, conne ...

  3. 全面掌握 Jest:从零开始的测试指南(上篇)

    随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节. 为什么需要单元测试 在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式.为 ...

  4. .NET 开源工业级移动端仓库管理系统

    前言 在工业生产中,定制化的软件对于每个环节都至关重要.对于仓库管理,推荐一款开源的仓库管理系统(WMS)解决方案. 这款基于.NET 框架开发的移动应用,提供了全面的仓库操作.订单处理.主数据管理. ...

  5. APP专项测试之兼容性测试

    1.APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节. APP 兼容性测 ...

  6. namenode rpc 请求队列调优

    当 datanode 上新写完一个块,默认会立即汇报给 namenode.在一个大规模 Hadoop 集群上,每时每刻都在写数据,datanode 上随时都会有写完数据块然后汇报给 namenode ...

  7. [OI] throw

    throw 主要是用来抛出异常. throw 可以直接向主程序 throw 一个东西,可以是各种数据类型,显示在界面上就是抛出的数据类型. int main(){ throw 1; } termina ...

  8. 离线安装MySQL

    离线安装mysql [下载地址](MySQL :: Download MySQL Community Server) 解压后依次执行如下命令 rpm -ivh mysql-community-comm ...

  9. 智慧矿山IT智能运维自动化解决方案

    矿山企业是国民经济中的重要组成部分,其资源开发和产业链条中涉及的环节与过程非常繁琐和复杂.随着我国矿山企业规模逐年扩大,为了提高其生产效率和降低其生产成本,信息化.数字化建设成为当下矿山企业发展的重要 ...

  10. 关系图谱后端不给指向性字段使用children

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...