zoukankan      html  css  js  c++  java
  • 02 策略模式

    策略模式

    1. 抽象类

    //优惠方式抽象类
    public abstract class CashSuperService {
    
        /**
         * 收费
         *
         * @param money 原价
         * @return 折后价
         */
        public abstract double acceptCash(double money);
    }
    

    2. 实现类

    //原价
    public class CashNormalService extends CashSuperService {
        
        @Override
        public double acceptCash(double money) {
            return money;
        }
    }
    
    //打折
    public class CashRebateService extends CashSuperService {
    
        /**
         * 折扣
         */
        private double moneyRebate = 1d;
    
        public CashRebateService(double moneyRebate) {
            this.moneyRebate = moneyRebate;
        }
    
        @Override
        public double acceptCash(double money) {
            return money * moneyRebate;
        }
    }
    
    //满减
    public class CashReturnService extends CashSuperService {
    
        /**
         * 条件
         */
        private double moneyCondition = 0.0d;
        /**
         * 返利
         */
        private double moneyReturn = 0.0d;
    
        public CashReturnService(double moneyCondition, double moneyReturn) {
            this.moneyCondition = moneyCondition;
            this.moneyReturn = moneyReturn;
        }
    
        @Override
        public double acceptCash(double money) {
            double result = money;
            if (result >= moneyCondition) {
                result = money - Math.floor(money / moneyCondition) * moneyReturn;
            }
            return result;
        }
    }
    

    3. Context上下文

    public class CashContext {
        private CashSuperService cashSuperService = null;
    
        public CashContext(String type) {
            switch (type) {
                case "正常":
                    cashSuperService = new CashNormalService();
                    break;
                case "满减":
                    cashSuperService = new CashReturnService(300, 100);
                    break;
                case "打折":
                    cashSuperService = new CashRebateService(0.8);
                    break;
            }
        }
    
        public double getResult(double money) {
            if (Objects.isNull(cashSuperService)) {
                throw new RuntimeException("没有此优惠条件");
            }
            return cashSuperService.acceptCash(money);
        }
    }
    

    4. 运行结果

    @Slf4j
    public class Client {
        public static void main(String[] args) {
            try {
                CashContext cashContext = new CashContext("满减");
                if (Objects.isNull(cashContext)) {
                    log.info("没有此优惠条件");
                }
                double result = cashContext.getResult(621);
                log.info("优惠后结果: {}", result);
            } catch (Exception e) {
                log.error("计算优惠异常, msg:{}", e.getMessage(), e);
            }
        }
    }
    
  • 相关阅读:
    uiwebview的基本使用
    当你在浏览器地址栏输入一个URL后回车,将会发生的事情?
    开车误闯红灯的补救方法 (以及由此引发的一些思考)
    Android源码剖析之Framework层基础版(窗口、linux、token、Binder)
    Android项目框架之图片加载框架的选择
    通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)
    awakeFromNib相关知识详解
    推送服务推荐
    由微博图床挂掉之后想到的
    Mac下如何配置环境变量
  • 原文地址:https://www.cnblogs.com/s-star/p/14076810.html
Copyright © 2011-2022 走看看