博客
关于我
设计模式 - 2) 策略模式
阅读量:595 次
发布时间:2019-03-10

本文共 2495 字,大约阅读时间需要 8 分钟。

针对现有代码的优化思路如下:

  • 问题分析
    当前代码通过CashContext类的switch-case逻辑来处理不同折扣类型的算法实现,这种方式虽然可行,但存在以下问题:
    • 每次新增折扣类型时,必须修改CashContext类的构造函数逻辑,这违反了修改封闭原则。
    • 代码的扩展性较差,新增算法时需要额外的工作量,降低了代码的可维护性。
    1. 优化思路

      为了解决上述问题,可以采用**策略模式(Strategy Pattern)**来优化代码结构。通过引入一个抽象Strategy接口,分别实现不同折扣算法的逻辑, 然后通过Strategy对象来统一处理计算任务。这种方式可以有效地遵循开放-封闭原则,提高代码的可扩展性。

    2. 具体实现步骤

      • 定义Strategy接口:创建一个Strategy接口,包含一个acceptCash方法,用于处理具体的金额计算逻辑。
      • 实现各个算法的Strategy子类:将现有的CashNomal、CashRebate、CashReturn等逻辑分别封装到不同的Strategy子类中,例如NormalStrategy、EightFoldStrategy、FullMinusStrategy等。
      • 优化CashContext类:CashContext类可以保持现有的结构,通过Strategy对象统一处理不同的算法逻辑。
      • 新增算法时的实现:只需实现一个新的Strategy子类,并注册到CashContext类中即可,无需修改现有代码。
      1. 代码优化示例
        以下是优化后的代码示例:
      2. // Strategy接口定义public interface IStrategy{    double AcceptCash(double money);}// 各算法实现public class NormalStrategy : IStrategy{    public double AcceptCash(double money)    {        return money;    }}public class EightFoldStrategy : IStrategy{    private double rebate = 0.8;    public EightFoldStrategy(double rebate)    {        this.rebate = rebate;    }    public double AcceptCash(double money)    {        return money * rebate;    }}public class FullMinusStrategy : IStrategy{    private double condition = 200;    private double returnMoney = 50;    public FullMinusStrategy(double condition, double returnMoney)    {        this.condition = condition;        this.returnMoney = returnMoney;    }    public double AcceptCash(double money)    {        if (money < condition)        {            return money;        }        return money - Math.Floor(money / condition) * returnMoney;    }}// CashContext优化后的实现public class CashContext{    private IStrategy strategy;    public CashContext(string type)    {        switch (type)        {            case "正常":                strategy = new NormalStrategy();                break;            case "8 折":                strategy = new EightFoldStrategy(0.8);                break;            case "满 200 - 50":                strategy = new FullMinusStrategy(200, 50);                break;            default:                strategy = null;                break;        }    }    public double GetResult(double money)    {        if (strategy == null)        {            return 0;        }        return strategy.AcceptCash(money);    }}
        1. 优化效果

          通过上述优化,CashContext类的构造函数逻辑被简化,新增折扣算法只需添加相应的Strategy子类即可,无需修改现有代码。这种方式不仅遵循了开放-封闭原则,还提高了代码的可维护性和扩展性。

        2. 后续优化建议

          • 如果需要新增其他类型的折扣算法(例如满减、满减优惠、无折扣等),只需创建相应的Strategy子类,并在CashContext类中注册即可。
          • 可以考虑在Strategy接口中增加更多通用方法,以支持更复杂的折扣逻辑。
          • 对现有代码进行统一的代码风格检查和重构,确保代码的整体一致性和可读性。

    转载地址:http://kcuvz.baihongyu.com/

    你可能感兴趣的文章
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>
    Spring Cloud 之注册中心 EurekaServerAutoConfiguration源码分析
    查看>>
    Parrot OS 6.2 重磅发布!推出全新 Docker 容器启动器
    查看>>
    Parrot OS 6.3 发布!全面提升安全性,新增先进工具,带来更高性能
    查看>>
    ParseChat应用源码ios版
    查看>>
    Part 2异常和错误
    查看>>
    Pascal Script
    查看>>
    Spring Boot集成Redis实现keyspace监听 | Spring Cloud 34
    查看>>
    Spring Boot中的自定义事件详解与实战
    查看>>
    Passport 密码模式
    查看>>
    Spring Boot(七十六):集成Redisson实现布隆过滤器(Bloom Filter)
    查看>>
    passwd命令限制用户密码到期时间
    查看>>
    Spring @Async执行异步方法的简单使用
    查看>>