策略模式项目应用

在这里插入图片描述


在这里插入图片描述


定义接口 UserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
public interface UserExpireCheckProcessor {
    /**
     * 获取渠道
     *
     * @return 渠道
     */
    String getChannel();

    /**
     * 校验
     *
     * @param context
     * @param param
     * @return
     */
    String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param);
}

零售通策略类 LSTUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.stereotype.Service;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class LSTUserExpireCheckProcessor implements UserExpireCheckProcessor {
    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.LST.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        return PosAccountStatusEnum.READY.name();
    }
}

如意策略类 RuyiUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.common.utils.DateUtil;
import com.alibaba.lst.pos.dao.entity.ruyi.account.RuyiAccountStoreRelationDO;
import com.alibaba.lst.pos.dao.facade.ruyi.account.RuyiAccountStoreRelationDAOFacade;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class RuyiUserExpireCheckProcessor implements UserExpireCheckProcessor {
    @Autowired
    private RuyiAccountStoreRelationDAOFacade ruyiAccountStoreRelationDAOFacade;

    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.RUYI.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        // 加个兼容逻辑
        // 新渠道不收费,但是防止老版本会受expireTime影响
        //查询账号 (如果有主子账号需要改造)
        RuyiAccountStoreRelationDO ruyiAccountStoreRelationDO = ruyiAccountStoreRelationDAOFacade.
            queryOwnerTypeAndDirectControlRuyiAccountStoreRelationByOwnerId(param.getOwnerId());
        // 增加一年
        Calendar calendar = Calendar.getInstance();
        if (ruyiAccountStoreRelationDO.getExpireDate() == null) {
            Date today = DateUtil.getDateIntegralPoint(new Date());
            calendar.setTime(today);
        } else {
            calendar.setTime(ruyiAccountStoreRelationDO.getExpireDate());
        }
        calendar.add(Calendar.DATE, AccountConsts.ONE_YEAR_DAYS);
        ruyiAccountStoreRelationDO.setExpireDate(calendar.getTime());
        ruyiAccountStoreRelationDAOFacade.update(ruyiAccountStoreRelationDO);
        return PosAccountStatusEnum.READY.name();
    }
}
	

优米策略类 SunmiUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.api.param.software.ServiceOrderBatchQueryParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.dao.entity.software.RuyiServiceOrderDO;
import com.alibaba.lst.pos.service.biz.account.ModuleBizImpl;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import com.alibaba.lst.pos.service.biz.software.ServiceOrderBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import static com.alibaba.lst.pos.service.biz.account.ModuleBizImpl.BASE_MODULE_CODE;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class SunmiUserExpireCheckProcessor implements  UserExpireCheckProcessor {

    @Autowired
    private ModuleBizImpl moduleBiz;

    @Autowired
    private ServiceOrderBiz serviceOrderBiz;

    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.SUNMI.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        Set<String> userModuleList = moduleBiz.getUserModuleList(param.getOwnerId(), context.getDeviceDetailDTO());
        context.setModuleList(new ArrayList<>(userModuleList));
        if (userModuleList.contains(BASE_MODULE_CODE)) {
            return PosAccountStatusEnum.READY.name();
        }
        // 查询一下,如果曾经有订单,则返回需要续费
        ServiceOrderBatchQueryParam serviceOrderBatchQueryParam = new ServiceOrderBatchQueryParam();
        serviceOrderBatchQueryParam.setOwnerId(param.getOwnerId());
        serviceOrderBatchQueryParam.setChannelCode(context.getChannelInfo().name());
        List<RuyiServiceOrderDO> ruyiServiceOrderDOS = serviceOrderBiz.batchQueryServiceOrder(serviceOrderBatchQueryParam);
        if (!ruyiServiceOrderDOS.isEmpty()) {
            return PosAccountStatusEnum.NEED_RENEW.name();
        }
        return PosAccountStatusEnum.NEED_PAY.name();
    }
}

定义一个工厂类

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.factory;

import com.alibaba.lst.pos.service.biz.ruyi.account.processor.user.UserExpireCheckProcessor;
import com.alibaba.lst.pos.service.biz.ruyi.account.processor.vendor.VendorActiveCheckProcessor;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Author xuzhiqiang
 * @Date 2022/2/8
 *
 * 使用策略模式 + 工厂模式
 *  登录是用户角色的判断操作
 *
 * 1:定义接口 UserExpireCheckProcessor
 *
 * 2:不同策略的类 实现接口UserExpireCheckProcessor  这里有策略
 *    LSTUserExpireCheckProcessor、RuyiUserExpireCheckProcessor、SunmiUserExpireCheckProcessor
 * 3:创建一个工厂类RuyiAccountExpireCheckProcessorFactory
 *   工厂类中定义一个map 用来保存所有的策略
 *   然后使用@Autowired注解用spring自动注入 spring会帮我们把map添加
 * 4:@Autowired
 *   private RuyiAccountExpireCheckProcessorFactory ruyiAccountExpireCheckProcessorFactory;
 *   注入工厂类
 * 5:VendorActiveCheckProcessor vendorActiveCheckProcessor = vendorActiveCheckProcessorFactory.getProcessor(channelInfo.name());
 *    boolean vendorActiveCheckPass = vendorActiveCheckProcessor.check(param);
 *
 */
@Service
public class RuyiAccountExpireCheckProcessorFactory {
    /**
     * @see com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum
     */
    private Map<String, UserExpireCheckProcessor> userExpireCheckProcessorMap;

    @Autowired
    public void setUserExpireCheckProcessorMap(List<UserExpireCheckProcessor> userExpireCheckProcessorList) {
        Map<String, UserExpireCheckProcessor> map = Maps.newHashMap();
        if (CollectionUtils.isNotEmpty(userExpireCheckProcessorList)) {
            for (UserExpireCheckProcessor processor : userExpireCheckProcessorList) {
                map.put(processor.getChannel(), processor);
            }
        }
        this.userExpireCheckProcessorMap = map;
    }

    public UserExpireCheckProcessor getProcessor(String channelCode) {
        return userExpireCheckProcessorMap.get(channelCode);
    }
}

使用

在这里插入图片描述

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...