前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的观察者模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以Java
语言为主, 好了, 废话不多说直接开整吧~
观察者模式
观察者模式
是一种设计模式,用于在对象间建立一对多的依赖关系,使得一个对象的状态发生变化时,其所有依赖对象都会收到通知并自动更新
。这种模式包含了两种类型的对象:主题(Subject)
和观察者(Observer)
。主题对象会在状态发生变化时通知所有注册的观察者对象,观察者接受到通知后会自动更新自己。
首先,我们定义主题接口Subject
和观察者接口Observer
:
public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } public interface Observer { void update(int value); }
接下来,我们定义一个具体的主题类CounterSubject
,它实现了Subject
接口,并包含了计数器的值和一个Observer
列表。这个类在计数器变化时会通知所有注册的观察者:
public class CounterSubject implements Subject { private int value; private ArrayList<Observer> observers; public CounterSubject() { observers = new ArrayList<Observer>(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(value); } } public void setValue(int newValue) { value = newValue; notifyObservers(); } public int getValue() { return value; } }
最后,我们定义了一个具体的观察者类CounterObserver
,它实现了Observer
接口,并在主题状态发生变化时更新自己:
public class CounterObserver implements Observer { private int value; public void update(int value) { this.value = value; System.out.println("CounterObserver: Value changed to " + value); } }
现在我们可以使用这些类来创建一个简单的观察者模式示例。首先,我们创建一个CounterSubject
实例,并注册两个CounterObserver
实例:
public class ObserverDemo { public static void main(String[] args) { CounterSubject subject = new CounterSubject(); CounterObserver observer1 = new CounterObserver(); CounterObserver observer2 = new CounterObserver(); subject.registerObserver(observer1); subject.registerObserver(observer2); subject.setValue(10); // Output: CounterObserver: Value changed to 10 subject.setValue(20); // Output: CounterObserver: Value changed to 20 } }
最佳实践
当电商平台上新商品或促销活动时,可能会有许多用户需要收到通知,并在他们的页面上看到这些新商品或促销活动。这时,我们可以使用观察者模式
来实现这个功能。在这种情况下,主题是电商平台,观察者是用户。
首先,我们定义主题接口Subject
和观察者接口Observer
:
public interface Observer { void update(String message); } public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(String message); }
然后,我们定义一个具体的主题类EcommercePlatform
,它实现了Subject
接口,并包含了用户的列表。这个类在有新商品或促销活动时会通知所有注册的观察者:
public class EcommercePlatform implements Subject { private ArrayList<Observer> observers; public EcommercePlatform() { observers = new ArrayList<Observer>(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers(String message) { for (Observer observer : observers) { observer.update(message); } } public void notifyUsers(String message) { notifyObservers(message); } }
最后,我们定义一个具体的观察者类User
,它实现了Observer
接口,并在主题状态发生变化时更新自己:
public class User implements Observer { private String name; public User(String name) { this.name = name; } public void update(String message) { System.out.println("User " + name + " received message: " + message); } }
现在我们可以使用这些类来创建一个简单的观察者模式示例。首先,我们创建一个EcommercePlatform
实例,并注册两个User
实例:
public class Demo { public static void main(String[] args) { EcommercePlatform ecommercePlatform = new EcommercePlatform(); User user1 = new User("小明"); User user2 = new User("小红"); ecommercePlatform.registerObserver(user1); ecommercePlatform.registerObserver(user2); ecommercePlatform.notifyUsers("New products on sale!"); // User 小明 received message: New products on sale! // User 小红 received message: New products on sale! } }
在实际应用中,观察者模式可以用于构建更复杂的系统,例如消息推送和实时数据更新等。
结束语
设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲状态模式
~
本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注
鼓励一下呗~
相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)
博客(阅读体验较佳)