当前位置:网站首页>观察者模式
观察者模式
2022-07-31 02:58:00 【wfsm】
观察者(Observer) : 又称 发布-订阅模式(publish-subscribe:Pub/Sub):他是一种通知机制,让发送通知的一方(被观察方) 和接收通知的一方(观察者) 能彼此分离,互不影响
定义对象间的 一种 一对多 的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新
假设一个电商网站,有多种Product(商品),同时,Customer(消费者)和Admin(管理员)对商品上架、价格改变都感兴趣,希望能第一时间获得通知。于是,Store(商场)可以这么写:Store希望发送通知给那些 关心 Product的人,而不想知道这些人是谁,,观察者模式就是分离被观察者,和观察者之间的耦合关系
将想要观察的人都实现一个接口,,在Store 修改商品信息的时候,并推送给这些观察者
/** * 要观察 这个产品 需要实现的接口 */
public interface ProductObserver {
void onPublished(Product product);
void onPriceChange(Product product);
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Product {
private String name;
private double price;
}
public class Store {
private List<ProductObserver> observers = new ArrayList<>();
private Map<String,Product> map = new HashMap<>();
// 注册观察者
public void addObserver(ProductObserver productObserver){
this.observers.add(productObserver);
}
// 取消注册
public void removeObserver(ProductObserver productObserver){
this.observers.remove(productObserver);
}
public void addNewProduct(String name,double price){
Product product = new Product(name, price);
map.put(name,product);
// 通知观察者
observers.forEach(observer->{
observer.onPublished(product);});
}
public void setProductPrice(String name,double price){
Product product = map.get(name);
product.setPrice(price);
// 通知观察者
observers.forEach(observer->{
observer.onPriceChange(product);});
}
}
测试:
public class Main {
public static void main(String[] args) {
Store store = new Store();
store.addObserver(new Observer01());
store.addObserver(new Observer02());
store.addNewProduct("gift",2d);
store.setProductPrice("gift",3d);
}
static class Observer01 implements ProductObserver{
@Override
public void onPublished(Product product) {
System.out.println("observer01 publish product "+product.getName());
}
@Override
public void onPriceChange(Product product) {
System.out.println("observer01 price change : "+product.getPrice());
}
}
static class Observer02 implements ProductObserver{
@Override
public void onPublished(Product product) {
System.out.println("observer02 publish product");
}
@Override
public void onPriceChange(Product product) {
System.out.println("observer02 price change");
}
}
}
引用:https://blog.csdn.net/u013087513/article/details/51839986
https://www.jianshu.com/p/2bb48cde23c9
https://www.liaoxuefeng.com/wiki/1252599548343744/1281319577321505
边栏推荐
- CentOS7下mysql5.7.37的卸载【完美方案】
- Mycat's master-slave relationship, vertical sub-database, horizontal sub-table, and detailed configuration of mycat fragmented table query (mysql5.7 series)
- SQL injection Less54 (limited number of SQL injection + union injection)
- The application of AI in the whole process of medical imaging equipment
- Chapter 9 SVM实践
- JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
- Go 项目实战-获取多级分类下的全部商品
- return in try-catch
- 【CV项目调试】CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT问题
- STM32CUBEMX develops GD32F303 (11) ---- ADC scans multiple channels in DMA mode
猜你喜欢

【C语言】进制转换一般方法
![Installation of mysql5.7.37 under CentOS7 [perfect solution]](/img/ef/a89d8bfd09377dc30034bad99dfd07.png)
Installation of mysql5.7.37 under CentOS7 [perfect solution]

4. Sensitive word filtering (prefix tree)

Basic learning about Redis related content

C#远程调试

Face detection based on opencv

【Bank Series Phase 1】People's Bank of China

10 Permission introduction

【C语言】三子棋(经典解法+一览图)

Classic linked list OJ strong training problem - fast and slow double pointer efficient solution
随机推荐
8、统一处理异常(控制器通知@ControllerAdvice全局配置类、@ExceptionHandler统一处理异常)
How to build a private yum source
19. Support Vector Machines - Intuitive Understanding of Optimization Objectives and Large Spacing
共模电感的仿真应用来了,满满的干货送给大家
Discourse 自定义头部链接(Custom Header Links)
execsnoop 工具
SQL 面试用题(重点)
JS 函数 this上下文 运行时点语法 圆括号 数组 IIFE 定时器 延时器 self.备份上下文 call apply
Installation of mysql5.7.37 under CentOS7 [perfect solution]
BAT can't sell "Medical Cloud": Hospitals flee, mountains stand, and there are rules
SQL注入 Less54(限制次数的SQL注入+union注入)
10 Permission introduction
Draw Your Cards
拒绝加班,程序员开发的效率工具集
Compile Hudi
[C language foundation] Solve C language error: expected ';', ',' or ')' before '&' token
关于 mysql8.0数据库中主键位id,使用replace插入id为0时,实际id插入后自增导致数据重复插入 的解决方法
LeetCode Daily Question 2022/7/25-2022/7/31
f.grid_sample
华为分布式存储FusionStorage知识点总结【面试篇】