JAVA设计模式-观察者模式
1.观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。又称发布订阅模式,减少代码耦合度。
2.业务场景:
酒店系统退款中心发起退款通知,不同业务模块酌情处理相关订单。
退款中心为被观察者,推送退款信息;
房间预订业务为观察者,退款业务修改房间状态;
外卖预定业务为观察者,退款业务处理红包等;
避免多个开发人员同时在退款业务中使用if判断订单归属,提交处理业务代码时的冲突。
3.demo代码:
退款中心(被观察者),继承Observable类
public class OrderRefund extends Observable {
/**
* 事件发起推送
* @param orderNum
*/
public void addRefundRecord(String orderNum) {
System.out.println(orderNum + "发起了退款");
setChanged();
notifyObservers(orderNum);
}
}
房间业务(观察者1),实现Observer接口
public class RoomObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String orderNum = (String) arg;
if (orderNum.startsWith("fj")) {
System.out.println("房间订单退款");
System.out.println("房间状态改为空闲");
} else {
System.out.println("房间订单不存在");
}
}
}
外卖业务(观察者2),实现Observer接口
public class TakeOutObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
String orderNum = (String) arg;
if (orderNum.startsWith("wm")) {
System.out.println("退还红包");
System.out.println("外卖订单退款");
} else {
System.out.println("外卖订单不存在");
}
}
}
发起退款测试
public class OrderObserverTest {
public static void main(String[] args) {
OrderRefund orderRefund = new OrderRefund();
//注入观察者
orderRefund.addObserver(new TakeOutObserver());
orderRefund.addObserver(new RoomObserver());
//添加退款记录,触发推送
orderRefund.addRefundRecord("fj16333333");
}
}
测试结果
结论:
房间业务和外卖业务都收到退款消息,通过判断进行后续处理。
本文目的仅仅体现观察者模式。