博客
关于我
设计模式 - 2) 策略模式
阅读量:599 次
发布时间: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/

    你可能感兴趣的文章
    python 将函数加到列表中进行调用
    查看>>
    python 将图片与字符串相互转换
    查看>>
    Python 嵌套字典全面指南
    查看>>
    Python 常见的错误类型和继承关系
    查看>>
    python 常量_零基础学Python系列之一:Python的变量与常量
    查看>>
    Python 并发编程
    查看>>
    python 序列化操作
    查看>>
    Python 开发者,这 7 个 VS Code 插件极力推荐
    查看>>
    python手把手视频_硬货 | 手把手带你构建视频分类模型(附Python演练))
    查看>>
    python 录音左右声道_Python分离立体声wav压缩文件的左右声道
    查看>>
    Python 循环异或对文件进行加解密
    查看>>
    Python开发环境搭建(附VMware安装包及虚拟机环境)
    查看>>
    python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
    查看>>
    Python 快速下载依赖
    查看>>
    python实现非参数统计的Cochran检验 (附完整源码)
    查看>>
    Python 手写数字识别-3-sklearn中的几种算法
    查看>>
    Python 打开文件注意事项
    查看>>
    python 批量修改文件名_python windows下批量修改文件名
    查看>>
    Python 抓取网页乱码问题 以及EXCEL乱码
    查看>>
    python 抓取网页内容
    查看>>