专栏首页cwl_Java设计模式-策略模式

设计模式-策略模式

1.准备工作,创建一个SpringBoot项目,不需要多余依赖
2.用于判定使用哪个策略的类
public class CashContext {

    private CashSuper cs;
    /**
     * 使用构造方法来进行选择具体的收费策略
     *
     * @param cashSuper
     */
    public CashContext(CashSuper cashSuper) {
        this.cs = cashSuper;
    }
    public Double getResult(Double money){
        return cs.acceptCash(money);
    }
}
3.支付方法的抽象类
    public abstract class CashSuper {
        /**
         * 接收现金支付的方法
         * @param money
         * @return
         */
        public abstract Double acceptCash(Double money);
    }
4.正常收费的情况
    public class CashNormal extends CashSuper {
        /**
         * 正常收费,即是不参与任何打折活动,故此直接返回当前收费现金
         *
         * @param money
         * @return
         */
        @Override
        public Double acceptCash(Double money) {
            return money;
        }
    }
5.打折收费的情况
    public class CashRebate extends CashSuper {
        private Double moneyRebate =1D;
        /**
         * 使用构造器来进行初始化打折率,构造方法的好处就是当初始化这个类的时候就会初始化好当前这个类的字段
         *
         * @param moneyRebate
         */
        public CashRebate(String moneyRebate) {
            this.moneyRebate = Double.parseDouble(moneyRebate);
        }
        @Override
        public Double acceptCash(Double money) {
            return money *moneyRebate;
        }
    }
6.满减活动
    public class CashReturn extends CashSuper {
        private Double moneyCondition =0.0D;//返利的条件
        private Double moneyReturn =0.0D;//满足多少条件之后返利多少
        /**
         * 使用构造方法来初始化返利的条件和达到返利条件之后的返利钱数
         *
         * @param moneyCondition
         * @param moneyReturn
         */
        public CashReturn(String moneyCondition, String moneyReturn) {
            this.moneyCondition = Double.parseDouble(moneyCondition);
            this.moneyReturn = Double.parseDouble(moneyReturn);
        }
        /**
         * 判断如果当前的钱数已经大于需要返利的钱数,那就使用Math.floor方法格式化小数点后的小数,是一个取整数的方法
         *
         * @param money
         * @return
         */
        @Override
        public Double acceptCash(Double money) {
            Double result = money;
            if (money >=moneyCondition) {
                result = money - Math.floor(money /moneyCondition) *moneyReturn;
            }
            return result;
        }
    }
7.controller中的方法
    /**
     * 使用策略模式来执行操作,是用工厂设计模式的缺陷就是算法会跟客户端的交互耦合在一起了,使用策略模式的好处就是相当于在工厂模式的外围再增加了一层保护套
     *
     * @param model
     * @param price
     * @param number
     * @param type
     * @return
     */
    @RequestMapping("strategy")
    public String strategy(Model model, Double price, Double number, String type) {
        Double currentprice = price * number;
        CashContext cc =null ;
        switch (type){
            case "正常收费" :
                cc =new CashContext(new CashNormal());
                break;
            case "满300返100" :
                cc =new CashContext(new CashReturn("300","100"));
                break;
            case "打8折" :
                cc =new CashContext(new CashRebate("0.8"));
                break;
        }
        Double totalPrice =0D;
        totalPrice = cc.getResult(currentprice);
        model.addAttribute("result", totalPrice);
        model.addAttribute("detail","单价:" + price +"\n" +"数量:" + number +"\n" +"应付:"
                + currentprice +"\n" +"实付" + totalPrice);
        return "login";
    }
8.ftl页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>商场收银台</title>
<body>
<form action="/calculate" method="post" >
    单价:<input type="text" size="30" name="price"><br>
    数量:<input type="text" size="30" name="number"><br>
    <select name="type">
        <option value="正常收费">正常收费</option>
        <option value="打8折">打8折</option>
        <option value="满300返100">满300返100</option>
    </select><br>
    <input type="submit" value="comfirm"><br>
    <textarea rows="5" cols="20" >
        ${(detail)!""}
    </textarea><br>
    总计:<input type="text" value="${(result)!""}" readonly><br>
</form>
<script type="text/javascript">
    $(function () {
        $("#reset").click(){
            $("input").val("");
        }
    });
</script>
</body>
</html>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java策略模式设计(简易收银台SpringBoot)

    cwl_java
  • 设计模式-工厂模式

    cwl_java
  • Java工厂设计模式(简单计算器实现)

    cwl_java
  • Spark 与 Hadoop 学习笔记 介绍及对比

    这篇博客将会简单记录Hadoop与Spark对比,HDFS,MapReduce的基本概念,及Spark架构设计,RDD,运行模式。整理起来一起阅读方便我们理解整...

    大鹅
  • java基础--相等

    学习:http://www.cnblogs.com/dolphin0520/p/3780005.html#3163302 后发现居然有这么个东西,当然也不会注意...

    Ryan-Miao
  • 编程小白 | 每日一练(116)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • 必须要讨论的四种分布式事务方案

    分布式事务伴随着微服务被人们一再提起。服务与服务之间的事务怎么处理比较好?到底使用哪种选择方案比较好。相信有人觉得分布式事务实现起来比较困难甚至不可能。也有人觉...

    ImportSource
  • 你也能用英伟达GAN造脸了:官方实现有了,高清数据集也开源了

    如今,它终于有了自己的名字,叫StyleGAN。顾名思义,GAN的生成器,是借用风格迁移的思路重新发明的。

    量子位
  • [Java 缓存] Java Cache之 Guava Cache的简单应用.

    一枝花算不算浪漫
  • 【小家Spring】源码分析Spring的事务拦截器:TransactionInterceptor和事务管理器:PlatformTransactionManager

    接着上一篇博文: 【小家Spring】从基于@Transactional全注解方式的声明式事务入手,彻底掌握Spring事务管理的原理

    YourBatman

扫码关注云+社区

领取腾讯云代金券