zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    paip.提升效率僵尸代码的迷思
    paip.输入法编程词库多意义条目分割 python实现.
    paip.提升效率提升绑定层次form绑定取代field绑定
    paip.提升效率调试日志系统日志参数含义python
    paip.自定义java 泛型类与泛型方法的实现总结
    paip.提升效率request自动绑定domain object
    paip.提升效率filter map reduce 的java 函数式编程实现
    paip.php 5.0 5.3 5.4 5.5 6.0的新特性总结与比较
    paip.解决中文url路径的问题图片文件不能显示
    paip.判断字符是否中文与以及判读是否是汉字uapi python java php
  • 原文地址:https://www.cnblogs.com/rese-t/p/8040233.html
Copyright © 2011-2022 走看看