设计模式(场景应用)

积累目前使用的策略模式



前言

根据目前项目的业务场景使用了不同的设计模式,简单的做个记录


一、策略模式

业务角度:本应用收到请求后需要根据类型处理不同的业务,如根据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));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值