Springboot项目实现简单的观察者模式
·
前言
最近在写项目的消息通知推送,本来一开始只有服务号的模板推送,后面发现很多人没有关注服务号,因此新增了一个小程序的订阅消息推送,这个不用关注,但是只能用户主动订阅的时候才能推送,而且目前只能推送一次性的。然后就开造,后面发现代码贼乱,耦合性又太强了,于是乎在想能不能使用设计模式来解决,最终经过多轮搜索+chatgpt,就使用观察者模式开造啦。
适用对象
用户注册后推送异步通知、加积分等。
正文
首先要定义一个MessagePushTask类,作为消息推送任务类。
import java.util.ArrayList;
import java.util.List;
public class MessagePushTask {
private List<NotificationObserver> observers = new ArrayList<>();
public void addObserver(NotificationObserver observer) {
observers.add(observer);
}
public void removeObserver(NotificationObserver observer) {
observers.remove(observer);
}
// 这里是举一个推送例子,比如是一个推送登陆成功通知
// 注意要开启异步消息
public void notifyLoginSuccessObservers(String message) {
for (NotificationObserver observer : observers) {
observer.loginSuccessMsg(message);
}
}
}
然后定义一个通知观察者类接口
/**
* @author lezi
* @version 1.0
* @date 16/4/2023 下午2:32
* @description
*/
public interface NotificationObserver {
/**
* 登陆成功通知
*
*/
void loginSuccessMsg(String message);
}
定义微信服务号模板消息推送观察者类
@Service
public class OfficialAccountsTmplMsgObserverimplements NotificationObserver {
@Override
void loginSuccessMsg(String message){
// do something...
}
}
定义微信小程序平台订阅消息推送观察者类
@Service
public class MiniProgramSubMsgObserver implements NotificationObserver {
@Override
void loginSuccessMsg(String message){
// do something...
}
}
测试类
@SpringBootTest
public class Test1 {
@Autowired
private MessagePushTask messagePushTask;
@Autowired
private MiniProgramSubMsgObserver miniProgramSubMsgObserver;
@Autowired
private OfficialAccountsTmplMsgObserver officialAccountsTmplMsgObserver;
@Test
void test11() {
// 登陆成功以后调用
messagePushTask.addObserver(miniProgramSubMsgObserver);
messagePushTask.addObserver(officialAccountsTmplMsgObserver);
messagePushTask.notifyLoginSuccessObservers("staff");
}
}
按照这样子配置下来,就可以很好的解耦啦,以后如果想要实现短信通知,直接实现NotificationObserver 接口就可以了,不用再去弄其他的。
然后我也看到别人在说使用Spring Event实现发布/订阅模式来实现,我看了以后感觉对项目改造有点大,就只搞了个简单的,但是使用spring这种,似乎更简单!有机会再尝试,对于观察者模式也是第一次用,懵懵懂懂,有不对的请大佬指正。
更多推荐



所有评论(0)