Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应

简介: 【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
  1. 观察者模式概述
  • 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在这个模式中,有两个主要角色:主题(Subject)和观察者(Observer)。主题是被观察的对象,它维护了一个观察者列表,并提供了用于添加、删除和通知观察者的方法。观察者是关注主题状态变化的对象,它们实现了一个更新接口,当主题状态改变时,主题会调用观察者的更新方法。
  • 例如,在一个简单的天气监测系统中,气象站是主题,它负责收集天气数据。而显示天气信息的各种设备(如手机应用、电子显示屏等)是观察者。当气象站更新天气数据(如温度、湿度等)时,所有的观察者设备都会收到通知并更新显示的天气信息。
  1. 事件背景与系统类比
  • 优衣库事件引发的市场反应类比
  • 在优衣库不使用新疆棉事件中,优衣库的这种行为可以看作是主题状态的改变。消费者群体、相关的供应商、竞争对手等可以看作是观察者。
  • 消费者(观察者)对优衣库的这种行为做出了反应,比如抵制购买优衣库的产品。从系统角度来看,这就相当于观察者接收到主题(优衣库品牌行为)状态改变的信号后,执行了相应的 “更新” 操作(改变购买行为)。
  • 供应商(观察者)可能会重新评估与优衣库的合作关系。这类似于在软件系统中,当主题状态改变时,观察者(供应商系统)根据新的情况更新自己的业务逻辑(如调整供货量或者终止合作)。
  • 在商业系统中的动态响应机制与观察者模式相似性
  • 商业系统中存在许多类似的动态响应场景,都可以用观察者模式来理解。例如,当一家公司(主题)发布了新产品或者改变了价格策略,其合作伙伴(如经销商、物流公司等观察者)和消费者(观察者)都会做出相应的反应。这些反应是基于对主题状态变化的感知,就像在观察者模式中,观察者对主题状态变化做出更新操作一样。
  1. 观察者模式的优势体现
  • 解耦主体和观察者
  • 在事件响应中,就像商业系统中的各个参与方不需要紧密耦合一样。以优衣库事件为例,消费者、供应商等各方的行为(观察者)和优衣库的品牌决策(主题)如果是硬编码在一起,那么系统将非常复杂且难以维护。而观察者模式使得这些观察者和主题之间是松耦合的关系。主题不需要知道观察者的具体细节,只需要在状态改变时通知它们。
  • 例如,在软件系统中,如果一个模块(主题)的内部逻辑发生变化,只要它通知观察者的接口不变,观察者(其他模块)就不需要进行大量的修改。这就好比在优衣库事件中,即使优衣库内部的品牌战略调整方式(主题内部逻辑)发生变化,消费者(观察者)的抵制行为逻辑(如通过社交媒体发声、改变购买习惯等)可以独立于优衣库的内部变化而存在,双方的关系通过一个简单的 “通知 - 响应” 机制(类似于观察者模式的通知和更新接口)来维持。
  • 易于扩展和维护
  • 当新的观察者加入时,在观察者模式下,只需要将新的观察者注册到主题中。就像在商业环境中,如果出现新的市场监督机构(新观察者)关注优衣库这类品牌的行为,它可以很容易地加入到这个 “观察系统” 中。
  • 从软件系统角度看,例如在一个电商系统中,新的促销活动提醒模块(新观察者)可以很容易地添加到关注商品价格变化(主题)的观察者列表中。对于维护来说,当主题或者观察者的业务逻辑发生变化时,只需要修改对应的主题或观察者内部的代码,而不会影响到其他部分的代码。这就好比在优衣库事件后,如果消费者的抵制方式发生变化(观察者逻辑改变)或者优衣库调整品牌形象修复策略(主题逻辑改变),这些修改可以相对独立地进行。
  1. 实际系统设计中的应用建议
  • 事件驱动架构借鉴
  • 在设计类似的具有动态响应需求的系统时,可以借鉴事件驱动架构,而观察者模式是事件驱动架构的一个基础模式。例如,在一个大型的电商平台中,可以将商品价格变化、库存变化等作为事件(主题状态变化),而订单系统、推荐系统等作为观察者。
  • 当商品价格下降(主题状态改变)时,订单系统可以根据新价格生成新的订单,推荐系统可以将该商品推荐给更多用户。通过这种方式,系统的各个部分可以根据事件的发生灵活地做出反应,就像在优衣库事件中,各个相关方根据品牌行为变化做出反应一样。
  • 消息队列的应用
  • 为了更好地实现观察者模式的通知机制,可以使用消息队列。消息队列可以作为主题和观察者之间的通信媒介,确保消息的可靠传递。例如,在一个金融系统中,当股票价格发生变化(主题状态改变)时,消息队列可以将价格变化消息发送给各个观察者(如交易系统、分析系统等)。
  • 这样可以避免因为网络波动或者系统繁忙等原因导致的通知丢失,同时也可以对消息进行异步处理,提高系统的整体性能和响应能力,就像在复杂的商业事件响应中,确保各个相关方能够及时、可靠地收到信息并做出响应。
相关文章
|
2月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
54 3
|
9天前
|
设计模式 存储 供应链
前端必须掌握的设计模式——观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,实现了一种订阅机制。它包含两个角色:**观察者**(订阅消息、接收通知并执行操作)和**被观察者**(维护观察者列表、发送通知)。两者通过一对多的关系实现解耦,当被观察者状态改变时,会通知所有订阅的观察者。例如,商店老板作为被观察者,记录客户的需求并在商品到货时通知他们。前端应用中,如DOM事件注册、MutationObserver等也体现了这一模式。
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
39 1
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
40 4
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
8天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
10天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
10天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。