本文介绍: 作者在工作中主要主导 A 业务线的系统建设,A 业务线主要是零售场景酒水的售卖与即时配送服务。为了方便运营在自研系统中对多平台商品进行管理而开发的三方平台商品管理功能,本次介绍的模版方法模式则是在该功能开发过程中的落地实践。
1. 业务背景
作者在工作中主要主导 A 业务线的系统建设,A 业务线主要是零售场景酒水的售卖与即时配送服务。为了方便运营在自研系统中对多平台商品进行管理而开发的三方平台商品管理功能,本次介绍的模版方法模式则是在该功能开发过程中的落地实践。
2. 技术方案选型
从系统建设角度来说最好的选择是第一种,但是对于一个业务方想要更快的提升运营效率来说,更好的选择是第二种和第三种,我们从自身业务情况、性能、后续向第一种方案演进的角度选择了第二种方案。
3. 模版方法应用
以下代码仅为演示对模版方法的应用和展示代码设计思路,有部分方法并未实现,但通过注释说明方法内做了什么操作。
3.1. 模版抽象类
@Component
public abstract class ThirdPlatformStoreGoodsOperations {
/**
* 商品上架
* @param storeGoodsShelvesParam 商品上架参数
* @return 新商品记录ID
*/
public Long shelves(StoreGoodsShelvesParam storeGoodsShelvesParam) {
// 获取门店本地商品
ThirdPlatformGoods localStoreGoods = this.getLocalStoreGoods(storeGoodsShelvesParam.getId());
if (localStoreGoods == null) {
throw new HistoricalDataException("商品数据已更新,请刷新当前页面");
}
// 上架三方平台门店商品
this.shelvesThirdPlatformStoreGoods(localStoreGoods);
// 刷新本地商品
StoreGoodsRefreshParam storeGoodsRefreshParam = new StoreGoodsRefreshParam();
BeanUtils.copyProperties(storeGoodsShelvesParam, storeGoodsRefreshParam);
return this.refreshOne(storeGoodsRefreshParam);
}
/**
* 商品下架
* @param storeGoodsWithdrawParam 商品下架参数
* @return 新商品记录ID
*/
public Long withdraw(StoreGoodsWithdrawParam storeGoodsWithdrawParam) {
// 获取门店本地商品
ThirdPlatformGoods localStoreGoods = this.getLocalStoreGoods(storeGoodsWithdrawParam.getId());
if (localStoreGoods == null) {
throw new HistoricalDataException("商品数据已更新,请刷新当前页面");
}
// 下架三方平台门店商品
this.withdrawThirdPlatformStoreGoods(localStoreGoods);
// 刷新本地商品
StoreGoodsRefreshParam storeGoodsRefreshParam = new StoreGoodsRefreshParam();
BeanUtils.copyProperties(storeGoodsWithdrawParam, storeGoodsRefreshParam);
return this.refreshOne(storeGoodsRefreshParam);
}
/**
* 增加商品库存
* @param storeGoodsIncreaseStockParam 增加商品库存参数
* @return 新商品记录ID
*/
public Long increaseStock(StoreGoodsIncreaseStockParam storeGoodsIncreaseStockParam) {
// 获取门店本地商品
ThirdPlatformGoods localStoreGoods = this.getLocalStoreGoods(storeGoodsIncreaseStockParam.getId());
if (localStoreGoods == null) {
throw new HistoricalDataException("商品数据已更新,请刷新当前页面");
}
// 增加三方平台店铺商品库存
this.increaseThirdPlatformStoreGoodsStock(storeGoodsIncreaseStockParam, localStoreGoods);
// 刷新本地商品
StoreGoodsRefreshParam storeGoodsRefreshParam = new StoreGoodsRefreshParam();
BeanUtils.copyProperties(storeGoodsIncreaseStockParam, storeGoodsRefreshParam);
return this.refreshOne(storeGoodsRefreshParam);
}
/**
* 增加商品库存
* @param storeGoodsDecreaseStockParam 减少商品库存参数
* @return 新商品记录ID
*/
public Long decreaseStock(StoreGoodsDecreaseStockParam storeGoodsDecreaseStockParam) {
// 获取门店本地商品
ThirdPlatformGoods localStoreGoods = this.getLocalStoreGoods(storeGoodsDecreaseStockParam.getId());
if (localStoreGoods == null) {
throw new HistoricalDataException("商品数据已更新,请刷新当前页面");
}
// 减少三方平台店铺商品库存
this.decreaseThirdPlatformStoreGoodsStock(storeGoodsDecreaseStockParam, localStoreGoods);
// 刷新本地商品
StoreGoodsRefreshParam storeGoodsRefreshParam = new StoreGoodsRefreshParam();
BeanUtils.copyProperties(storeGoodsDecreaseStockParam, storeGoodsRefreshParam);
return this.refreshOne(storeGoodsRefreshParam);
}
/**
* 刷新店铺单个商品
* @param storeGoodsRefreshParam 刷新店铺单个商品参数
* @return 新商品记录ID
*/
public Long refreshOne(StoreGoodsRefreshParam storeGoodsRefreshParam) {
// 获取门店本地商品
ThirdPlatformGoods localStoreGoods = this.getLocalStoreGoods(storeGoodsRefreshParam.getId());
if (localStoreGoods == null) {
throw new HistoricalDataException("商品数据已更新,请刷新当前页面");
}
// 获取三方门店商品
StoreGoodsInfoResult storeGoodsInfoResult = this.getThirdPlatformStoreGoods(storeGoodsRefreshParam, localStoreGoods);
// 刷新本地商品
return this.refreshLocalStoreGoods(storeGoodsRefreshParam, storeGoodsInfoResult);
}
/**
* 刷新店铺商品
* @param storeGoodsRefreshParam 刷新店铺单个商品参数
* @param storeGoodsInfoResult 三方门店商品
*/
private Long refreshLocalStoreGoods(StoreGoodsRefreshParam storeGoodsRefreshParam,
StoreGoodsInfoResult storeGoodsInfoResult) {
// 更新本地商品
}
/**
* 获取本地店铺商品信息
* @param localStoreGoodsId 本地商品ID
* @return 本地店铺商品信息
*/
private ThirdPlatformGoods getLocalStoreGoods(Long localStoreGoodsId) {
// 获取本地商品
}
/**
* 上架三方店铺商品
* @param localStoreGoods 本地店铺商品信息
*/
protected abstract void shelvesThirdPlatformStoreGoods(ThirdPlatformGoods localStoreGoods);
/**
* 下架三方店铺商品
* @param localStoreGoods 本地店铺商品信息
*/
protected abstract void withdrawThirdPlatformStoreGoods(ThirdPlatformGoods localStoreGoods);
/**
* 获取三方平台店铺商品
* @param storeGoodsRefreshParam 刷新店铺单个商品参数
* @param localStoreGoods 本地商品
* @return 三方门店商品
*/
protected abstract StoreGoodsInfoResult getThirdPlatformStoreGoods(StoreGoodsRefreshParam storeGoodsRefreshParam,
ThirdPlatformGoods localStoreGoods);
/**
* 增加三方平台店铺商品库存
* @param storeGoodsIncreaseStockParam 增加三方平台店铺商品库存参数
* @param localStoreGoods 本地店铺商品信息
*/
protected abstract void increaseThirdPlatformStoreGoodsStock(StoreGoodsIncreaseStockParam storeGoodsIncreaseStockParam,
ThirdPlatformGoods localStoreGoods);
/**
* 减少三方平台店铺商品库存
* @param storeGoodsDecreaseStockParam 减少三方平台店铺商品库存参数
* @param localStoreGoods 本地店铺商品信息
*/
protected abstract void decreaseThirdPlatformStoreGoodsStock(StoreGoodsDecreaseStockParam storeGoodsDecreaseStockParam,
ThirdPlatformGoods localStoreGoods);
/**
* 获取对应平台
* @return 平台枚举
*/
protected abstract ThirdPlatformEnums getPlatform();
}
3.2. 模版实现类
public class ELEStoreGoodsTemplate extends ThirdPlatformStoreGoodsOperations {
@Override
protected void shelvesThirdPlatformStoreGoods(ThirdPlatformGoods localStoreGoods) {
// 饿了么平台商品上架
}
@Override
protected void withdrawThirdPlatformStoreGoods(ThirdPlatformGoods localStoreGoods) {
// 饿了么平台商品下架
}
@Override
protected StoreGoodsInfoResult getThirdPlatformStoreGoods(StoreGoodsRefreshParam storeGoodsRefreshParam,
ThirdPlatformGoods localStoreGoods) {
// 获取饿了么平台商品信息
return null;
}
@Override
protected void increaseThirdPlatformStoreGoodsStock(StoreGoodsIncreaseStockParam storeGoodsIncreaseStockParam,
ThirdPlatformGoods localStoreGoods) {
// 增加饿了么平台商品库存
}
@Override
protected void decreaseThirdPlatformStoreGoodsStock(StoreGoodsDecreaseStockParam storeGoodsDecreaseStockParam, ThirdPlatformGoods localStoreGoods) {
// 减少饿了么平台商品库存
}
@Override
protected ThirdPlatformEnums getPlatform() {
return ThirdPlatformEnums.ELEMO;
}
}
4. 与 Spring 结合管理模版实现类
4.1. 基于 Spring IoC 容器依赖查找管理模版
@Component
public class ThirdPlatformGoodsTemplateManage {
public Map<ThirdPlatformEnums, ThirdPlatformStoreGoodsOperations> templateMap = new HashMap<>(5);
public ThirdPlatformGoodsTemplateManage(ListableBeanFactory listableBeanFactory){
ObjectProvider<ThirdPlatformStoreGoodsOperations> beanProvider = listableBeanFactory.getBeanProvider(ThirdPlatformStoreGoodsOperations.class);
for (ThirdPlatformStoreGoodsOperations template : beanProvider) {
templateMap.put(template.getPlatform(), template);
}
}
public ThirdPlatformStoreGoodsOperations getTemplate(ThirdPlatformEnums thirdPlatformEnum) {
ThirdPlatformStoreGoodsOperations thirdPlatformStoreGoodsOperations = templateMap.get(thirdPlatformEnum);
Assert.notNull(thirdPlatformStoreGoodsOperations, String.format("%s平台模版未找到!", thirdPlatformEnum.getDesc()));
return thirdPlatformStoreGoodsOperations;
}
public ThirdPlatformStoreGoodsOperations getTemplate(String platformCode) {
ThirdPlatformEnums thirdPlatformEnum = ThirdPlatformEnums.getInstanceByCode(platformCode);
ThirdPlatformStoreGoodsOperations thirdPlatformStoreGoodsOperations = templateMap.get(thirdPlatformEnum);
Assert.notNull(thirdPlatformStoreGoodsOperations, String.format("%s平台模版未找到!", platformCode));
return thirdPlatformStoreGoodsOperations;
}
}
4.2. 基于 BeanPostProcessor + 注解方式管理模版
@Component
public class ThirdPlatformStoreGoodsOperationsInitialization implements BeanPostProcessor {
@Resource
private ThirdPlatformGoodsTemplateManage thirdPlatformGoodsTemplateManage;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof ThirdPlatformStoreGoodsOperations && bean.getClass().isAnnotationPresent(ThirdPlatformStoreGoodsOperationsTemplate.class)){
ThirdPlatformStoreGoodsOperations thirdPlatformStoreGoodsOperations = (ThirdPlatformStoreGoodsOperations) bean;
thirdPlatformGoodsTemplateManage.templateMap.put(thirdPlatformStoreGoodsOperations.getPlatform(), thirdPlatformStoreGoodsOperations);
}
return bean;
}
}
5. 为什么选择模版方法
看完代码实现再回过头来,说说选择模版方法的原因:
- 从功能角度来说对三方平台商品管理无非就是那么几个商品新增、商品编辑、商品库存调整、商品上下架等;
- 从商品领域建模对三方平台商品领域行为抽象可分为:创建、修改、增加库存、减少库存、覆盖库存、上架、下架等;
- 从代码复用的角度来说不同平台商品的操作不同的只有最终调用三方平台的差异上,其他代码都可复用,假设第一次开发只先适配美团,那么在美团适配后复用的代码理论上不需要做任何修改;
- 从代码可扩展角度来说,如果增加其他平台,仅需要继承模版抽象类,实现抽象方法即可;
- 从关注点分离角度来说后续适配其他平台仅仅需要关注如何操作三方平台即可,这对新人或者不了解的人来继续迭代有很大好处,关注点集中在如何适配三方平台上;
原文地址:https://blog.csdn.net/m0_37602117/article/details/134679059
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_5887.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。