积累目前使用的策略模式
文章目录
前言
根据目前项目的业务场景使用了不同的设计模式,简单的做个记录
一、策略模式
业务角度:本应用收到请求后需要根据类型处理不同的业务,如根据type给不同的平台发送message
实现过程:创建顶级策略接口,具体策略实现,创建工厂类创建具体策略实例,模板化策略接口
使用步骤
1.创建顶级策略类
代码如下(示例):
public abstract class AbstractMsgStrategy {
/**
* 获取策略
*
* @return 策略枚举
*/
protected abstract MsgSendEnum getTypeEnum();
@PostConstruct
private void init() {
MsgFactory.register(getTypeEnum().getType(), this);
}
/**
* 发送消息
*
* @param recvUserList 收文用户列表
* @param messageDTO 消息传输对象
*/
public abstract void sendMessage(List<RevUsers> recvUserList, MessageDTO messageDTO);
/**
* 推送消息处理状态
*
* @param ids 业务id
* @param recvIds 收信息方
*/
public abstract void pushMessageStatus(List<String> ids, List<String> recvIds);
}
2.创建具体策略实现
代码如下(示例):
@Component
public class InteriorDeptMsgStrategy extends AbstractMsgStrategy {
@Override
protected MsgSendEnum getTypeEnum() {
return MsgSendEnum.INTERIOR; //不同的策略类枚举类型不同
}
@Override
public void sendMessage(List<RevUsers> recvUserList, MessageDTO messageDTO) {
//具体实现代码逻辑
}
@Override
public void pushMessageStatus(List<String> ids, List<String> recvIds) {
}
}
3.创建工厂类创建具体策略实例
代码如下(示例):
public class MsgFactory {
private static final Map<Integer, AbstractMsgStrategy> STRATEGY_MAP = new HashMap<>();
public static void register(Integer markType, AbstractMsgStrategy strategy) {
STRATEGY_MAP.put(markType, strategy);
}
public static AbstractMsgStrategy getStrategyNoNull(Integer markType) {
AbstractMsgStrategy strategy = STRATEGY_MAP.get(markType);
Assert.notNull(strategy, "传入参数有误!");
return strategy;
}
}
4.具体调用
代码如下(示例):
AbstractMsgStrategy xtStrategy = MsgFactory.getStrategyNoNull(MsgSendEnum.INTERIOR.getType());
xtStrategy.pushMessageStatus();
二、发布订阅模型;(观察者模式)
业务角度:执行业务操作之后需要发信息给三方平台,涉及多个三方平台(类似于广播通知)
实现过程:首先定义事件模型(Event);定义事件消费者;在业务逻辑中添加发布动作;
1.定义事件模型
public class MsgEvent extends ApplicationEvent {
//消息模板
private final MsgTemplate msgTemplate;
public GroupMemberAddEvent(Object source, MsgTemplate msgTemplate) {
super(source);
this.msgTemplate= msgTemplate;
}
2.定义事件消费者
@Component
public class MsgListener {
@Async
@TransactionalEventListener(classes = MsgEvent.class, fallbackExecution = true)
public void sendAddMsg(MsgEvent event) {
}
}
3.逻辑中添加发布动作
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
public void xxxDoing() {
MsgTemplate msg = new MsgTemplate();
applicationEventPublisher.publishEvent(new MsgEvent(this, msg));
}