最近需要写一个消息推送的服务,根据前端用户的配置支持不同的消息服务,应用到了策略模式
总结:
- 首先准备一个公用的接口服务类MsgService,定义一个send方法,参数为封装的MsgVO类(MsgVO类中定义一个type,然后引入不同的消息服务的VO类作为主VO类的参数)
- 不同的消息服务定义各自的接口和接口实现类,接口实现类可以实现多个接口,分别实现自己的接口和公用接口MsgService,重写send方法(由于不同的消息服务需要的参数不同,这里可以在自己的接口实现类中写一个方法,然后在send方法中调用这个方法,传参为MsgVO类中自己的VO类属性,从而实现可拓展和解耦)
- 写一个配置类MsgContext(用@configuration注解),写一个静态方法,参数为不同的消息服务接口实现类,返回一个Map<String,MsgService>,将这个map作为静态属性,静态方法中设置map的key为服务type,value为参数中的消息服务接口实现类
- 在controller中接收一个MsgVO类,调用MsgContext的静态属性,返回一个map,根据MsgVO中获取的type在map中得到目标服务,调用公共send方法,从而实现推送功能
- 在远程服务中传参时,可以先查询数据库消息服务是否开启,拿到服务开启的key,此时不需要判断该key为哪个服务的key,直接将MsgVO类不同的消息服务的VO类设置好参数,将查询到的key设置到MsgVO类的type,调用远程feign的send方法即可
- 程序可根据前端的启用配置自由切换服务
反思:刚开始的时候对程序不太理解,认为由于传入的参数不同,必须在业务服务中确定是哪个消息服务,或者考虑远程获取到配置类的map从而获取到特定的消息服务,才能进行传参,考虑后理解可以将不同的参数封装成一个公共的VO类,服务正常在消息服务中心进行调用,其他微服务只需要提供必须的参数以供判断