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