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);
            }
        }
    }
    
  • 相关阅读:
    帝国cms更新报错解决办法
    帝国cms 不能正常显示最新文章
    帝国CMS Table '***.phome_ecms_news_data_' doesn't exist
    【C++】C++中的字符和字符串
    【Python】 解析Python中的运算符
    【C++】C++中的数组
    【Python】解析Python的缩进规则
    【python】解析Python的安装和配置
    【Zend Studio】在Zend Studio中调试ThinkPhp框架
    【C++】C++中typedef、auto与decltype的作用
  • 原文地址:https://www.cnblogs.com/s-star/p/14076810.html
Copyright © 2011-2022 走看看