前言

最近在写项目的消息通知推送,本来一开始只有服务号的模板推送,后面发现很多人没有关注服务号,因此新增了一个小程序的订阅消息推送,这个不用关注,但是只能用户主动订阅的时候才能推送,而且目前只能推送一次性的。然后就开造,后面发现代码贼乱,耦合性又太强了,于是乎在想能不能使用设计模式来解决,最终经过多轮搜索+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这种,似乎更简单!有机会再尝试,对于观察者模式也是第一次用,懵懵懂懂,有不对的请大佬指正。

更多推荐