基于策略模式和工厂模式进行代码优化

本文介绍了如何在Spring框架下定义和实现策略接口AppHandler,通过具体类AHandler处理资讯产品消息推送,以及策略工厂类AppFactory动态注册和选择策略实例。
摘要由CSDN通过智能技术生成

1.定义策略接口

package com.essence.handler.apphandler;


import com.essence.beans.param.AppMessageParam;
import com.essence.beans.param.SnosParam;
import org.springframework.beans.factory.InitializingBean;

import java.util.Map;

public interface AppHandler extends InitializingBean {
    Map<String, String> appMessagePush(AppMessageParam param);
    public boolean support(SnosParam snos);
    public  int getOrder();
}

2.具体的策略类实现

/**
 * 资讯产品策略类
 */
@Component
@Slf4j
public class AHandler implements AppHandler {
    @Value("${TZXURL_PREFIX}")
    private String TZXURL_PREFIX;
    @Value("${appArticleProIds}")
    private List<String> appArticleProIds;

    @Override
    public Map<String, String> appMessagePush(AppMessageParam param) {
     
        return resultMap;
    }

    @Override
    public boolean support(SnosParam snos) {
        return appArticleProIds.contains(snos.getProId()) || "资讯文章".equals(snos.getInfoName());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        AppFactory.register(this);
    }
    @Override
    public int getOrder() {
        return 1;
    }

 
}

3.策略工厂类

public class AppFactory {

    //private static Map<Snos, AHandler> strategyMap = new HashMap<>();
    private static List<AppHandler> strategyList = new ArrayList<>();

   public static AppHandler getInvokeStrategy(SnosParam snos) {
        strategyList=strategyList.stream().sorted(Comparator.comparing(AppHandler::getOrder)).collect(Collectors.toList());
        for (AppHandler appHandler : strategyList) {
            //条件满足
            boolean support = appHandler.support(snos);
            if (support) {
                return appHandler;
            }
        }

        return null;
    }

    public static void register(AppHandler handler) {
        strategyList.add(handler);
    }

}

4.调用

  // 根据条件获得策略
            AppHandler appHandler = AppFactory.getInvokeStrategy(SnosParam.builder()
                    .proId(infoParam.getProId())
                    .infoName(infoParam.getInfoName())
                    .infoCont(infoParam.getInfoCont())
                    .infoLink(infoParam.getInfoLink())
                    .relStock(infoParam.getRelStock())
                    .goodsId(infoParam.getGoodsId())
                    .msgType(infoParam.getMsgType())
                    .mainId(infoParam.getMainId())
                    .build());
            //调用具体的策略类获取参数
            Map<String, String> resultMap = appHandler.appMessagePush(AppMessageParam.builder()
                    .content(infoParam.getContent())
                    .title(infoParam.getTitle())
                    .infoCont(infoParam.getInfoCont())
                    .proId(infoParam.getProId())
                    .execMsg(infoParam.getExecMsg())
                    .proSname(bindCustInfoParamList.get(0).getProsName())
                    .mainId(infoParam.getMainId())
                    .infoName(infoParam.getInfoName())
                    .infoLink(infoParam.getInfoLink())
                    .build());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值