前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-策略模式

设计模式-策略模式

作者头像
cwl_java
发布2019-10-26 20:46:10
3540
发布2019-10-26 20:46:10
举报
文章被收录于专栏:cwl_Java
1.准备工作,创建一个SpringBoot项目,不需要多余依赖
2.用于判定使用哪个策略的类
代码语言:javascript
复制
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.支付方法的抽象类
代码语言:javascript
复制
    public abstract class CashSuper {
        /**
         * 接收现金支付的方法
         * @param money
         * @return
         */
        public abstract Double acceptCash(Double money);
    }
4.正常收费的情况
代码语言:javascript
复制
    public class CashNormal extends CashSuper {
        /**
         * 正常收费,即是不参与任何打折活动,故此直接返回当前收费现金
         *
         * @param money
         * @return
         */
        @Override
        public Double acceptCash(Double money) {
            return money;
        }
    }
5.打折收费的情况
代码语言:javascript
复制
    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.满减活动
代码语言:javascript
复制
    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中的方法
代码语言:javascript
复制
    /**
     * 使用策略模式来执行操作,是用工厂设计模式的缺陷就是算法会跟客户端的交互耦合在一起了,使用策略模式的好处就是相当于在工厂模式的外围再增加了一层保护套
     *
     * @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页面
代码语言:javascript
复制
<!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>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.准备工作,创建一个SpringBoot项目,不需要多余依赖
  • 2.用于判定使用哪个策略的类
  • 3.支付方法的抽象类
  • 4.正常收费的情况
  • 5.打折收费的情况
  • 6.满减活动
  • 7.controller中的方法
  • 8.ftl页面
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档