当前位置:网站首页>Observer pattern
Observer pattern
2022-07-31 03:03:00 【wfsm】
观察者(Observer) : 又称 发布-订阅模式(publish-subscribe:Pub/Sub):He is a notification mechanism,让发送通知的一方(被观察方) 和接收通知的一方(观察者) 能彼此分离,互不影响
定义对象间的 一种 一对多 的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动更新
假设一个电商网站,有多种Product(商品),同时,Customer(消费者)和Admin(管理员)对商品上架、价格改变都感兴趣,希望能第一时间获得通知.于是,Store(商场)可以这么写:Store
Hope to send notifications to those 关心 Product
的人,And don't want to know who these people are,,Observer pattern is to separate the observed,和观察者之间的耦合关系
Implement an interface for everyone you want to observe,,在Store When modifying product information,and push to these observers
/** * 要观察 这个产品 需要实现的接口 */
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
边栏推荐
猜你喜欢
Discourse 自定义头部链接(Custom Header Links)
【C语言】求两个整数m和n的最大公因数和最小公倍数之和一般方法,经典解法
Why is String immutable?
12 Disk related commands
4、敏感词过滤(前缀树)
递归查询单表-单表树结构-(自用)
C#远程调试
SQL injection Less46 (injection after order by + rand() Boolean blind injection)
接口测试关键技术
Local area network computer hardware information collection tool
随机推荐
TCP详解(二)
4. Sensitive word filtering (prefix tree)
局域网电脑硬件信息收集工具
12 磁盘相关命令
Number 16, top posts
Thesis framework of the opening report
Office automation case: how to automatically generate period data?
【Cocos Creator 3.5】缓动系统停止所有动画
LeetCode简单题之找到和最大的长度为 K 的子序列
6. Display comments and replies
False positives and false negatives in testing are equally worthy of repeated corrections
6、显示评论和回复
The whole process scheduling, MySQL and Sqoop
刚出道“一战成名”,安全、舒适一个不落
【HCIP】ISIS
华为分布式存储FusionStorage知识点总结【面试篇】
CloudCompare&PCL 计算两个点云之间的重叠度
Mysql 45讲学习笔记(二十五)MYSQL保证高可用
Addition and Subtraction of Scores in LeetCode Medium Questions
LeetCode Daily Question 2022/7/25-2022/7/31