簡單策略模式

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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章