当前位置:网站首页>观察者模式
观察者模式
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
边栏推荐
- Unity3D Button mouse hover enter and mouse hover exit button events
- 10 权限介绍
- 拒绝加班,程序员开发的效率工具集
- AI在医疗影像设备全流程应用
- Number 16, top posts
- 19. Support Vector Machines - Intuitive Understanding of Optimization Objectives and Large Spacing
- Compile Hudi
- 【C语言】表达式求值的一般方法
- The Sad History of Image Processing Technology
- C#远程调试
猜你喜欢
随机推荐
Basic learning about Redis related content
19. Support Vector Machines - Intuitive Understanding of Optimization Objectives and Large Spacing
共模电感的仿真应用来了,满满的干货送给大家
Unity3D Button 鼠标悬浮进入与鼠标悬浮退出按钮事件
Mysql 45讲学习笔记(二十五)MYSQL保证高可用
MPPT solar charge controller data collection - through the gateway acquisition capacity battery SOC battery voltage, wi-fi
Unity3D Button mouse hover enter and mouse hover exit button events
Maximum area of solar panel od js
11、Redis实现关注、取消关注以及关注和粉丝列表
Discourse 自定义头部链接(Custom Header Links)
知识蒸馏7:知识蒸馏代码详解
【Bank Series Phase 1】People's Bank of China
Number 16, top posts
Discussion on Service Commitment of Class Objects under Multithreading
6. Display comments and replies
学习DAVID数据库(1)
全流程调度——MySQL与Sqoop
Why is String immutable?
Draw Your Cards
12 Disk related commands