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

    刚开始看《大话设计模式》这本书,在此记录一些个人的理解,不当之处请指教。

    策略模式

    策略模式是对一些规则/算法的封装模式,有时候需要对一个数据根据应用场景的不同做不同的处理,为避免太多的逻辑判断,减少代码的耦合,处理的方式可以封装起来。

    结构如图:

    比如在本按例中,需要对收到的金额做不同的处理,1、普通收费,2、打折销售,3、积分抵扣

    从所有的方法类中抽取一个运算的抽象方法,形成一个抽象类

    package cn.sasa.strategy;
    
    //运算方法的抽象类
    public abstract class Strategy {
        //抽象方法
        public abstract double Calculate(double momey);
    }

    各个计算方法继承Strategy

    package cn.sasa.strategy;
    //普通计算
    public class NormalCalculate extends Strategy{
    
        @Override
        public double Calculate(double momey) {
            return momey;
        }
    
    }
    package cn.sasa.strategy;
    
    import java.math.BigDecimal;
    //打折销售
    public class DiscountCalculate extends Strategy{
    
        private double discount = 1d;
        
        public DiscountCalculate(double discount) {
            this.discount = discount;
        }
        
        @Override
        public double Calculate(double money) {
            BigDecimal moneydec = new BigDecimal(money);
            BigDecimal discountdec = new BigDecimal(discount);
            return moneydec.multiply(discountdec).doubleValue();
        }
    
    }
    package cn.sasa.strategy;
    //积分抵扣
    public class ScourCalculate extends Strategy{
    
        private double scour = 0;
        private double subMoney = 0; 
        public ScourCalculate(double scour) {
            this.scour = scour;
            subMoney = this.scour*0.001;
        }
        
        @Override
        public double Calculate(double money) {
            return money-subMoney;
        }
    
    }

    处理规则

    package cn.sasa.strategy;
    //处理规则的类
    public class StrategyContext {
        public Strategy stra;
    
        // 传递一个标识
        //策略与简单工厂结合
        public StrategyContext(int flag) {
            switch (flag) {
            case 1:
                stra = new NormalCalculate();
                break;
            case 2:
                stra = new DiscountCalculate(0.8);
                break;
            case 3:
                stra = new ScourCalculate(200);
                break;        
            }
        }
    
        // 调用计算的方法
        public double Calculate(double money) {
            return stra.Calculate(money);
        }
    
    }

    客户端代码:

    package cn.sasa.strategy;
    
    import java.util.Scanner;
    
    public class test {
        public static void main(String[] args) {
            System.out.println("请输入计算方式");
            System.out.println("1、普通计算 2、打折销售 3、积分抵扣");
            Scanner sc = new Scanner(System.in);
            int flag = sc.nextInt();
            System.out.println("你输入的是"+flag);
            StrategyContext context = new StrategyContext(flag);
            System.out.println(context.Calculate(200));
        }
    }

    这样如果再增加计算的规则,那么只需要再定义一个计算的类,再在处理规则的类中添加相应的处理。

    每个规则都是独立的,规则之间互不影响,在进行测试的时候更容易发现问题。

  • 相关阅读:
    C++ istringstream总结
    C++各数据类型的最值
    AcWing 机器人跳跃问题 二分
    蓝桥杯 矩形面积交
    蓝桥杯 完美的代价
    蓝桥杯 数的读法
    国内 镜像 下载
    redis的pipline使用
    MySQL额外操作
    sql强化演练( goods 表练习)
  • 原文地址:https://www.cnblogs.com/SasaL/p/10616905.html
Copyright © 2011-2022 走看看