
在对象间定义一种一对多的依赖关系,当一个对象的状态发生了改变,所有依赖它的对象都被通知且会自动更新。
观察者模式UML类图
设想有这么一个场景:在电商公司的订单管理系统中,如果订单已经支付,需要通知到物流系统和采购系统,物流系统需要进行发货操作,而采购系统则需要采购新的商品,在这个案例中,订单就是一个被观察者,如果它的状态发生了改变(已支付),则需要通知到物流系统和采购系统,这两个系统执行相应的操作以应对这种状态的改变。
首先定义一个观察者接口:
package com.sample.patterns.observer;
// 抽象观察者
public interface Observer {
// 观察者所需要做的更新
void update();
}
接下来是抽象主题,在我们的案例里,它是一个订单:
package com.sample.patterns.observer;
// 订单接口,它是被观察者
public interface Order {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
然后是抽象主题的具体实现,也就是客户订单,它会维护一个自身的订单状态和一个观察者列表,在状态发生改变时通知到所有的观察者:
package com.sample.patterns.observer;
import java.util.ArrayList;
import java.util.List;
// 具体的被观察者类
public class CustomerOrder implements Order{
private List<Observer> list = new ArrayList();
// 订单状态:0 未支付;1 已支付
private int state = 0;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObserver();
}
@Override
public void registerObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
// 通知所有的观察者
@Override
public void notifyObserver() {
for(Observer observer:list){
observer.update();
}
}
}
有两个观察者的具体实体,一个是物流系统,一个是采购系统:
package com.sample.patterns.observer;
// 观察者:物流系统
public class LogisticsObserver implements Observer{
private int state;
private CustomerOrder order;
public LogisticsObserver(CustomerOrder order){
this.order = order;
this.order.registerObserver(this);
}
@Override
public void update() {
this.state = order.getState();
System.out.println("Observer state updated to: " + this.state);
// 如果状态变为已支付,则开始运输
if(this.state==1){
System.out.println("Begin to transport!");
}
}
}
package com.sample.patterns.observer;
// 观察者:采购系统
public class PurchaseObserver implements Observer{
private int state;
private CustomerOrder order;
public PurchaseObserver(CustomerOrder order){
this.order = order;
this.order.registerObserver(this);
}
@Override
public void update() {
this.state = order.getState();
System.out.println("Observer state updated to: " + this.state);
// 如果状态变为已支付,则开始运输
if(this.state==1){
System.out.println("Begin to purchase!");
}
}
}
最后,我们写一个客户端类来进行测试,我们先创建一个客户订单,并且让两个观察者订阅这个客户订单,然后再改变这个订单的状态,可以看到,物流系统和采购系统在订单状态改变后,都进行了相应的操作处理。
package com.sample.patterns.observer;
// 测试客户端
public class Client {
public static void main(String[] args) {
CustomerOrder order = new CustomerOrder();
LogisticsObserver logisticsObserver = new LogisticsObserver(order);
PurchaseObserver purchaseObserver = new PurchaseObserver(order);
order.setState(1);
}
}
输出结果如下:
以上就是关于观察者模式的介绍,它使得观察者和被观察者松耦合,比较适用于一对多且状态需要同步更新的场景,如果需要新增观察者,只需要实现Observer接口并注册到Subject的列表中即可。
都看到这里了,请帮忙一键三连啊,也就是点击文末的在看、点赞、分享,这样会让我的文章让更多人看到,也会大大地激励我进行更多的输出,谢谢!
鸣谢:
https://refactoring.guru/design-patterns/observer
推荐阅读:
原文始发于微信公众号(互联网全栈架构):一呼百应:监听变化的观察者模式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/173605.html