简单策略模式

package com.strategy;

/**
 * 抽象策略
 * @author YangTG
 *
 */
public interface Strategy {
	
	void price();
}
package com.strategy;

/**
 * 具体策略实现
 * @author YangTG
 *
 */
public class BookStrategy implements Strategy{

	@Override
	public void price() {
		
		System.out.println("The boos is 25¥");
	}
	
	
}
package com.strategy;

/**
 * 具体策略实现
 * @author YangTG
 *
 */
public class ClothesStrategy implements Strategy{

	@Override
	public void price() {
		
		System.out.println("the clothes is 50¥");
	}

}
package com.strategy;

/**
 * 具体策略实现
 * @author YangTG
 *
 */
public class Shoe implements Strategy{

	@Override
	public void price() {
		
		System.out.println("The shoe is 500¥");
	}

}
package com.strategy;

/**
 * 环境,创建某个策略
 * @author YangTG
 *
 */
public class Context {
	
	private  Strategy strategy;
	
	public Context(Strategy strategy){
		this.strategy=strategy;
	}
	
	public void goodsPrice(){
		strategy.price();
	}
}

main测试

package com.strategy;

/**
 * 策略模式
 * @author YangTG
 *
 */
public class StrategyDemo {
	
	public static void main(String[] args) {
		Context context = new Context(new BookStrategy());
		context.goodsPrice();	
	}
}

使用案例

背景: 分配规则,根据数据库里的不同配置,返回不同的区域id和用户地址

package com.sitech.market.common.mktbatch.huaxiao;

import com.sitech.crmtpd.market.domain.param.AddressProdInstData;
import com.sitech.market.common.domain.FeaturesCampaignDomain;

/**
 * @oauth: qiangSW
 * @date: 2020/6/10 9:37
 * @description: com.sitech.market.common.mktbatch.huaxiao
 * @doc:
 */
public interface AssignedStrategyInterface {

    /**
     * 策略
     * @param featuresCampaignDomain
     * @param userId
     * @param addrChoose
     * @param addressProdInstData
     */
    public void isAddress(FeaturesCampaignDomain featuresCampaignDomain, Long userId,String addrChoose,
                          AddressProdInstData addressProdInstData);


    /**
     * long 判断
     * @param orgId
     * @return
     */
    default Long paraseOrgId(Long orgId) {

        return orgId == null ? 1l : orgId;
    }
}
package com.sitech.market.common.mktbatch.huaxiao;

import com.sitech.crmtpd.market.domain.param.AddressProdInstData;
import com.sitech.market.common.domain.FeaturesCampaignDomain;
import org.springframework.stereotype.Component;

/**
 * @oauth: qiangSW
 * @date: 2020/6/10 9:38
 * @description: com.sitech.market.common.mktbatch.huaxiao
 * @doc: 位置营销分配策略
 */
@Component("addressTypeStrategy")
public class AddressTypeStrategy implements AssignedStrategyInterface {
    @Override
    public void isAddress(FeaturesCampaignDomain featuresCampaignDomain,
                          Long userId,String addrChoose,
                          AddressProdInstData addressProdInstData) {
        switch (addrChoose) {
            case "1":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getWorkOrgIdOne()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getWorkStationAddressOne());
                break;
            case "2":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getWorkOrgIdTwo()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getWorkStationAddressTwo());
                break;
            case "3":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getWorkOrgIdThree()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getWorkStationAddressThree());
        }
    }
}
package com.sitech.market.common.mktbatch.huaxiao;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sitech.crmtpd.market.domain.param.AddressProdInstData;
import com.sitech.market.common.config.RunProjectConfig;
import com.sitech.market.common.domain.FeaturesCampaignDomain;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import java.net.URL;
import java.util.List;
import java.util.Map;

/**
 * @oauth: qiangSW
 * @date: 2020/6/10 10:50
 * @description: com.sitech.market.common.mktbatch.huaxiao
 * @doc: 归属地策略
 */
@Component("localStrategy")
@Slf4j
public class LocalStrategy implements AssignedStrategyInterface {

    @Autowired
    private RunProjectConfig runProjectConfig;
    @Override
    public void isAddress(FeaturesCampaignDomain featuresCampaignDomain,
                          Long userId, String addrChoose,
                          AddressProdInstData addressProdInstData) {
        switch (addrChoose) {
            case "4":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getLocaionOrgIdOne()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getLocationAddressOne());
                break;
            case "5":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getLocaionOrgIdTwo()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getLocationAddressTwo());
                break;
            case "6":
                featuresCampaignDomain.setOrgId(paraseOrgId(addressProdInstData.getLocaionOrgIdThree()));
                featuresCampaignDomain.setUserAddress(addressProdInstData.getLocationAddressThree());
                break;
            case "7":
                Long orgId = getOrgIdFromCust(userId);
                if (orgId != null) {
                    featuresCampaignDomain.setOrgId(orgId);
                }
        }
    }

    /**
     * 查询客户中心,返回对应的阻止标识
     * 入参 用户实例id
     *
     * @param userId
     * @return null or orgId
     */
    public Long getOrgIdFromCust(Long userId) {

        List<Map<String, Object>> list = runProjectConfig.allIpConfig();
        StringBuffer urlBuffer = new StringBuffer();

        StringBuffer paramBody = new StringBuffer();
        list.stream().filter(f -> {
            return "738084".equals(f.get("PARA_ID"));
        }).forEach(e -> {
            urlBuffer.append(e.get("PARA_NAME"));
            paramBody.append(e.get("PARA_CONFIG").toString());
        });
        // 替换参数
        String param = paramBody.toString().replace("param1", userId.toString());
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
        StringBuffer response = new StringBuffer();
        try {
            OkHttpClient okHttpClient = new OkHttpClient();
            URL url = new URL(urlBuffer.toString());
            Request build = new Request.Builder().url(url)
                    .post(requestBody).build();
            Response execute = okHttpClient.newCall(build).execute();
            if (execute != null && HttpStatus.OK.value() == execute.code()) {
                response.append(execute.body().string());
            }
        } catch (Exception e) {
            log.error("{}请求客户中心发生异常:", userId, e);
            return null;
        }
        log.info("##userId{},请求客户中心返回值{}", userId, response.toString());
        JSONObject contractRoot = JSONObject.parseObject(response.toString());
        JSONObject svcCont = contractRoot.getJSONObject("contractRoot").getJSONObject("svcCont");
        if ("0".equals(svcCont.getString("resultCode"))) {
            JSONArray returnBody = svcCont.getJSONObject("respObject").getJSONArray("returnBody");
            if (returnBody != null) {
                Long orgId = Long.valueOf(String.valueOf(returnBody.getJSONObject(0).get("createOrgId")));
                return orgId;
            }
        }
        return null;
    }
}
package com.sitech.market.common.mktbatch.huaxiao;

import com.sitech.market.common.domain.FeaturesCampaignDomain;
import com.sitech.market.common.util.SpringBeanUtile;
import org.springframework.stereotype.Component;

/**
 * @oauth: qiangSW
 * @date: 2020/6/12 15:46
 * @description: com.sitech.market.common.mktbatch.huaxiao
 * @doc: 策略管理中心
 */
@Component
public class AddressTypeStrategyManage {

    /**
     * 返回策略对象
     * @param addrType
     * @return
     */
    public AssignedStrategyInterface context(String addrType) {

        if ("1".equals(addrType)) {
            return SpringBeanUtile.getApplicationContext("addressTypeStrategy");
        } else if ("2".equals(addrType)) {
            return SpringBeanUtile.getApplicationContext("localStrategy");
        }
        return null;
    }
}

策略使用

/**
     * 查询活动渠道配置属性,判断活动是否是位置营销
     * 630:是否位置营销  1:是          0:否
     * 631:位置类型  1:工作地   2:归属地
     * 633:位置选择  1:工作地1  2:工作地2  3:工作地3   4:常驻地1   5:常驻地2  6:常驻地3
     *
     * @param campaignId
     */
    public FeaturesCampaignDomain isAddr(Long campaignId, Long userId, Long chlId) {
        FeaturesCampaignDomain featuresCampaignDomain = new FeaturesCampaignDomain();
        List<MktCamChlConfAttr> mktCamChlConfAttrs = yfConfigMapper.queryCamChlConfAttrByCampaignId(campaignId, chlId);

        /**
         *  是否是营销位置
         *   位置类型
         *   位置选择
         */
        if (!CollectionUtils.isEmpty(mktCamChlConfAttrs)) {
            return featuresCampaignDomain;
        }
        String isAddr = "";
        String addrType = "";
        String addrChoose = "";
        for (MktCamChlConfAttr camChlConfAttr : mktCamChlConfAttrs) {
            if (630l == camChlConfAttr.getAttrId()) {
                isAddr = camChlConfAttr.getAttrValue();
            } else if (631l == camChlConfAttr.getAttrId()) {
                addrType = camChlConfAttr.getAttrValue();
            } else if (632l == camChlConfAttr.getAttrId()) {
                addrChoose = camChlConfAttr.getAttrValue();
            } else if (3338L == camChlConfAttr.getAttrId().longValue()) {
                isAddr = "1";
                addrType = "2";
                addrChoose = "7";
                break;
            }

        }
        AssignedStrategyInterface context = addressTypeStrategyManage.context(addrType);
        if (!"1".equals(isAddr) || null == context) {
            return featuresCampaignDomain;
        }
        featuresCampaignDomain.setFlag(true);
        /*查询用户位置*/
        List<AddressProdInstData> addressProdInstDatas = yfConfigMapper.queryAddrByUserId(userId);
        if (!CollectionUtils.isEmpty(addressProdInstDatas)) {
            AddressProdInstData addressProdInstData = addressProdInstDatas.get(0);
            context.isAddress(featuresCampaignDomain, userId, addrChoose, addressProdInstData);
            getManagr(featuresCampaignDomain);
        } else {
            featuresCampaignDomain.setOrgId(1l);
            featuresCampaignDomain.setUserAddress("-1");
        }
        return featuresCampaignDomain;
    }
}

bean工具

package com.sitech.market.common.util;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @oauth: qiangSW
 * @date: 2019/10/31 13:44
 * @description: com.sitech.mkt.util
 * @doc: 手动实列化bean
 */
@Component
public class SpringBeanUtile implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringBeanUtile.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {

        return applicationContext;
    }

    public static <T> T getApplicationContext(String str) {

        return (T) applicationContext.getBean(str);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值