参考自:
https://blog.csdn.net/qq_14989227/article/details/78566175
https://www.cnblogs.com/luihengk/p/4156624.html
在订单业务流程中使用观察者模式
观察者模式心得:
观察者模式解决了一个业务方法需要不断扩容其它业务流程但是不改这个业务方法。
关键设计:主题subject需要维护一个观察者集合,然后只要执行订单主题的业务方法,最后subject.notifyObservers()会循环观察者,执行观察者的update。
tips:主要用到Observerable类和Observer接口,Observerable主要维护了一个观察者集合,主题subject可以直接继承该类;Observer是观察者需要实现的接口
例如:创建订单接口之后可能需要支付接口、通知接口等等,订单接口可以作为主题subject、支付和通知接口作为观察者,注册到订单主题中,只需要调用订单接口就好。
运行结果:
1. main方法:
package cn.smarthse.modules.giian.observer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.smarthse.modules.giian.GiianServiceStart;
/**
* <<观察者模式测试>>
* 创建订单接口之后需要执行支付接口、通知接口等等,为了不改已存在的创建订单的接口,引入观察者模式
* 订单接口可以作为主题subject、支付和通知接口作为观察者(ObserverOne、ObserverTwo),注册到订单主题(OrderSubject)中,只需要调用订单接口就好。
* 类说明:
* OrderSubject:订单(主题subject,是Observable类派生出来的子类)
* ObserverOne:观察者1(可以为添加订单之后的支付接口)
* ObserverTwo:观察者2(可以为添加订单之后的通知接口)
* ObserverXxx:观察者xxx(可以为添加订单之后的其它接口)
* 观察者模式思想:主题某方法执行完后,在不改变主题该方法的前提下,添加观察者并注册到指定主题subject中来实现添加其它业务流程。
* 观察者关键具体实现:Observable.obs:观察者集合,这个集合的维护过程是各个观察者自行注册到指定主题subject中的
* 整个对象初始化流程:
* 1.这些对象在同一个springboot工程中
* 2.OrderSubject初始化
* 3.ObserverOne和ObserverTwo的初始化,期间会改变OrderSubject.obs(其观察者集合)
* @Author liaoly(廖凌云) [1302013247@qq.com]
* @Date 2020年11月30日 上午9:46:07
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=GiianServiceStart.class)
public class OrderObservableTest {
@Autowired
private OrderSubject orderSubject;
@Test
public void test() {
orderSubject.addOrder("订单20201130");
orderSubject.notifyObservers();
}
}
2.主题(Subject)
package cn.smarthse.modules.giian.observer;
import java.util.Observable;
import org.springframework.stereotype.Service;
import lombok.Data;
/**
* 订单主题类
*
* @Author liaoly(廖凌云) [1302013247@qq.com]
* @Date 2020年11月30日 上午9:03:47
*/
@Service
public @Data class OrderSubject extends Observable {
/**
* 订单参数,观察者需要获取订单数据
*/
private String orderObject;
/**
* 添加订单,返回订单信息
*
* @author liaoly
* @date 2020年11月30日 上午9:24:57
* @param args : 创建订单需要的参数(尽量模拟实际情况)
* @return String 返回订单实体,这里为了方便没有定义订单类
*/
public String addOrder(String args){
System.out.println("添加订单!");
this.orderObject = args + "对象";
this.setChanged();
return args + "对象";
}
}
3. 观察者1
package cn.smarthse.modules.giian.observer;
import java.util.Observable;
import java.util.Observer;
import org.springframework.stereotype.Service;
/**
* 观察者1(可以为添加订单之后的支付接口)
*
* @Author liaoly(廖凌云) [1302013247@qq.com]
* @Date 2020年11月30日 上午9:29:36
*/
@Service
public class ObserverOne implements Observer {
public ObserverOne(OrderSubject orderSubject) {
orderSubject .addObserver(this); //把自己这个观察者注册到订单主题中
}
@Override
public void update(Observable o, Object arg) {
OrderSubject subject = (OrderSubject) o;
doBusinessOne(subject.getOrderObject());
}
/**
* 观察者1的业务处理逻辑
*
* @author liaoly
* @date 2020年11月30日 上午9:35:25
* @param OrderObject void
*/
public void doBusinessOne(String OrderObject){
System.out.println("观察者1的业务处理逻辑,OrderObject:" + OrderObject);
}
}
4.观察者2
package cn.smarthse.modules.giian.observer;
import java.util.Observable;
import java.util.Observer;
import org.springframework.stereotype.Service;
/**
* 观察者2(可以为添加订单之后的通知接口)
*
* @Author liaoly(廖凌云) [1302013247@qq.com]
* @Date 2020年11月30日 上午9:29:36
*/
@Service
public class ObserverTwo implements Observer{
public ObserverTwo(OrderSubject orderSubject) {
orderSubject.addObserver(this); //把自己这个观察者注册到订单主题中
}
@Override
public void update(Observable o, Object arg) {
OrderSubject subject = (OrderSubject) o;
doBusinessOne(subject.getOrderObject());
}
/**
* 观察者2的业务处理逻辑
*
* @author liaoly
* @date 2020年11月30日 上午9:35:25
* @param OrderObject void
*/
public void doBusinessOne(String OrderObject){
System.out.println("观察者2的业务处理逻辑,OrderObject:" + OrderObject);
}
}