博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在商城系统中使用设计模式----策略模式之在spring中使用策略模式
阅读量:6079 次
发布时间:2019-06-20

本文共 5069 字,大约阅读时间需要 16 分钟。

在商城系统中使用设计模式----策略模式之在spring中使用策略模式

1.前言:

这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式。

2.问题:

在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

在spring 中,策略对象在正常情况下是,在启动Spring容器对时候,已经将策略对象加载创建完成成为bean。

我们如何在Spring中正确对使用策略模式,这样又会发生什么问题呢?

3.使用场景: 

场景:商城活动中有几种,满减,打折,送积分.我们要获取商品对最终价格。

4.实现

步骤一.创建接口类

复制代码

public interface GoodsActivity {

/** * 获取应该支付的金额 * @param amount 商品的单价 * @return */BigDecimal getPayPrice(BigDecimal amount);

}

复制代码
步骤二.实现接口,并添加@Component注解

复制代码

@Component
public class DiscountActivity implements GoodsActivity {

//折扣private double discount ;@Overridepublic BigDecimal getPayPrice(BigDecimal amount) {    //假装从数据库的配置表取折扣    discount = 8.0;    return new BigDecimal(discount).multiply(amount).divide(new BigDecimal(10));}

}

复制代码
复制代码
@Component
public class FullReduceActivity implements GoodsActivity {

//满多少private BigDecimal fullAmount;//减多少private BigDecimal reductionAmount ;@Overridepublic BigDecimal getPayPrice(BigDecimal amount) {    //假装从数据库的配置表取配置数据    fullAmount = new BigDecimal(300);    reductionAmount  = new BigDecimal(100);    return amount.compareTo(fullAmount)>=0?amount.subtract(reductionAmount):amount;}

}

复制代码
复制代码
@Component
public class IntegralActivity implements GoodsActivity {

//抵扣的积分  10积分=1元private int integral = 100;@Overridepublic BigDecimal getPayPrice(BigDecimal amount) {    return amount.subtract(new BigDecimal(integral/10));}

}

复制代码
步骤三.创建context

复制代码

public class GoodsActivityContext {

private GoodsActivity goodsActivity;public GoodsActivityContext(GoodsActivity goodsActivity){    this.goodsActivity=goodsActivity;}/** * 获取商品价格 * @param amount * @return */public BigDecimal getPrice(BigDecimal amount){    return goodsActivity.getPayPrice(amount);}

}

复制代码
步骤四.在控制层中调用策略模式

复制代码

@RestController
public class ActivityController{

@Autowiredprivate DiscountActivity discountActivity;@Autowiredprivate FullReduceActivity fullReduceActivity;@Autowiredprivate IntegralActivity integralActivity;
/** * 获取最终售价 *  (这样的控制层写法很不友好,需要写大量的代码去实现) *      为了解决这个问题,将引用工厂模式... * *      工厂是创建型模式,它的作用就是创建对象; *      策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为; * *  解决不同的问题 * 工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。 * 策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。 * * 工厂相当于黑盒子,策略相当于白盒子; * * * @param activityType * @param amount * @return */@RequestMapping("getLastPrice")public ResponseResult getLastPrice(String activityType,BigDecimal amount){    ResponseResult responseResult = ResponseResult.getInstance();    GoodsActivityContext goodsActivityContext;    //根据活动类型获取最终售价    switch (activityType){        case "discount":            goodsActivityContext = new GoodsActivityContext(discountActivity);            break;        case "fullReduce":            goodsActivityContext = new GoodsActivityContext(fullReduceActivity);            break;        case "integral":            goodsActivityContext = new GoodsActivityContext(integralActivity);            break;        default:            responseResult.setCode(1);            responseResult.setMsg("数据类型错误");            responseResult.setData(null);            return responseResult;    }    responseResult.setCode(0);    responseResult.setMsg("操作成功");    responseResult.setData(goodsActivityContext.getPrice(amount));    return responseResult;}

}

复制代码

总结:按照注释说明,很明显我们需要优化这个策略模式。

步骤三:(2) 引入工厂模式,对策略对象进行管理

复制代码

@Component
public class GoodsActivityStrategyFactory {

@Autowiredprivate Map
goodsActivityMap;/** * 根据活动类型 获取所对应的策略 * @param activityType */public GoodsActivityContext getGoodsActivityStrategy(String activityType){ GoodsActivityContext goodsActivityContext; switch (activityType){ case "discount": goodsActivityContext = new GoodsActivityContext(goodsActivityMap.get("discountActivity")); break; case "fullReduce": goodsActivityContext = new GoodsActivityContext(goodsActivityMap.get("fullReduceActivity")); break; case "integral": goodsActivityContext = new GoodsActivityContext(goodsActivityMap.get("integralActivity")); break; default: goodsActivityContext = null; } return goodsActivityContext;}

}

复制代码
步骤四.在控制层中调用策略模式

复制代码

@RestController
public class ActivityController{

@Autowiredprivate GoodsActivityStrategyFactory goodsActivityStrategyFactory;
@RequestMapping("getLastPrice_V2")public ResponseResult getLastPrice_V2(String activityType,BigDecimal amount){
ResponseResult responseResult = ResponseResult.getInstance();    //从工厂中获取  活动策略    GoodsActivityContext goodsActivityContext = goodsActivityStrategyFactory.getGoodsActivityStrategy(activityType);    if (goodsActivityContext==null){        responseResult.setCode(1);        responseResult.setData(null);        responseResult.setMsg("数据类型错误");        return responseResult;    }    responseResult.setCode(0);    responseResult.setMsg("操作成功");    responseResult.setData(goodsActivityContext.getPrice(amount));    return responseResult;}

}

复制代码

源码:

在springboot中使用策略模式

原文地址

转载地址:http://sjagx.baihongyu.com/

你可能感兴趣的文章
147.使用 editplus 连接 Linux系统
查看>>
Redis 的安装配置介绍
查看>>
红米5.0以上手机一键激活XPOSED框架的经验
查看>>
除了FineBI,国内还有哪些比较好的BI产品
查看>>
信修修:显示器黑屏无信号 但电脑一直在运行的原因和解决办法
查看>>
RAID阵列
查看>>
使用libsvm进行文本分类
查看>>
Windows server 2003到Windows server 2008 R2的迁移本地升级
查看>>
项目中应用eventbus解决的问题
查看>>
Android中使用Sqlite数据库 (一) 建表
查看>>
2-05 使用固态存储SSD或PCIe卡
查看>>
【转】如何在LINUX中安装下载到的软件
查看>>
随机密码生成工具
查看>>
Java解析XML的方法(Dom4j生成和解析XML)
查看>>
苹果供应链的秘密
查看>>
windows镜像EI.CFG文件
查看>>
5 种使用 Python 代码轻松实现数据可视化的方法
查看>>
触摸屏笔记本回顾 - 惠普TX2000
查看>>
configure: error: xml2-config not found. Please ch
查看>>
Xenserver6.2安装文档(图文详解)
查看>>