• java策略模式


    模式的定义

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

    使用场景

    • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
    • 需要安全的封装多种同一类型的操作时。
    • 出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。

    实现方式

    举例说明

    A旗舰店除了正常日不打折,在节假日会推出满300减100,全场8折等活动

    步骤1:定义抽象策略角色(Strategy):现金收费抽象类

    abstract class CashSuper {
        public abstract double acceptCash(double money);
    }

    步骤2:定义具体策略角色(Concrete Strategy):每个节日具体的促销活动

    正常收费类

    public class CashNormal extends CashSuper{
        @Override
        public double acceptCash(double money) {
            return money;
        }
    }

    打折收费类

    public class CashRebate extends CashSuper{
        private double moneyRebate=1;
        public CashRebate(double moneyRebate){
            this.moneyRebate=moneyRebate; //如八折时,传入0.8
        }
        @Override
        public double acceptCash(double money) {
            return money*moneyRebate;
        }
    }

    满减收费类

    public class CashReduce extends CashSuper{
        private double moneyCondition=0;
        private double moneyReduce=0;
    
        public CashReduce(double moneyCondition, double moneyReduce) { //如满300减100,传入300,100
            this.moneyCondition = moneyCondition;
            this.moneyReduce = moneyReduce;
        }
    
        @Override
        public double acceptCash(double money) {
            double result=money;
            if (money>moneyCondition){//若大于满减条件,减去满减值
                result=money-Math.floor(money/moneyCondition)*moneyReduce;
            }
            return result;
        }
    }

    步骤3:定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员

    public class CashContext {
        private CashSuper cs = null;
    
        public CashContext(String type) {
            switch (type) {
                case "normal":
                    CashNormal cashNormal = new CashNormal();
                    cs = cashNormal;
                    break;
                case "rebate":
                    CashRebate cashRebate = new CashRebate(0.8);
                    cs = cashRebate;
                    break;
                case "reduce":
                    CashReduce cashReduce = new CashReduce(300, 100);
                    cs = cashReduce;
                    break;
            }
        }
    
        public double getResult(double money) {
            return cs.acceptCash(money);
        }
    }

    步骤4:客户端调用

    public class SalesMan {
        public static void main(String[] args) {
    
            CashContext mSalesMan;
    
            //平常不打折,消费了1000
            mSalesMan = new CashContext("normal");
            double normalResult = mSalesMan.getResult(1000);
            System.out.println("平常:" + normalResult);
    
            //国庆打8折,消费了1000
            mSalesMan = new CashContext("rebate");
            double rebateResult = mSalesMan.getResult(1000);
            System.out.println("国庆:" + rebateResult);
    
            //元旦满30减100,消费了1000
    
            mSalesMan = new CashContext("reduce");
            double reduceResult = mSalesMan.getResult(1000);
            System.out.println("元旦:"+reduceResult);
        }
    
    }

    输出结果

    平常:1000.0

    国庆:800.0

    元旦:700.0

    优点:

    • 结构清晰明了、使用简单直观。
    • 耦合度相对而言较低,扩展方便。
    • 操作封装也更为彻底,数据更为安全。

    缺点:

    • 随着策略的增加,子类也会变得繁多。
    • java学习群669823128
  • 相关阅读:
    SpringIOC——refresh()
    SpringIOC——scan()
    MySQL——查询性能优化
    [php-error-report]PHP Strict Standards: Only variables should be passed by reference
    [阅读]谈谈个人对“金融是否需要互联网”命题之辩
    [javascript]jsonp-function 代码段
    [javascript-snippet]使用javascript+html5实现图片的灰度处理
    [javascript]Three parts of javascript code snippet
    表格显示高亮
    关于FTP的根目录
  • 原文地址:https://www.cnblogs.com/rese-t/p/8040233.html
Copyright © 2020-2023  润新知