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

    你可能感兴趣的文章
    Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现recursive insertion sort递归插入排序算法(附完整源码)
    查看>>
    Objective-C实现RedBlackTree红黑树算法(附完整源码)
    查看>>
    Objective-C实现redis分布式锁(附完整源码)
    查看>>
    Objective-C实现reverse letters反向字母算法(附完整源码)
    查看>>
    Objective-C实现ripple adder涟波加法器算法(附完整源码)
    查看>>
    Objective-C实现RodCutting棒材切割最大利润算法(附完整源码)
    查看>>
    Objective-C实现Romberg算法(附完整源码)
    查看>>
    Objective-C实现RRT路径搜索(附完整源码)
    查看>>
    Objective-C实现rsa 密钥生成器算法(附完整源码)
    查看>>
    Objective-C实现RSA密码算法(附完整源码)
    查看>>
    Objective-C实现runge kutta龙格-库塔法算法(附完整源码)
    查看>>
    Objective-C实现segment tree段树算法(附完整源码)
    查看>>
    Objective-C实现selection sort选择排序算法(附完整源码)
    查看>>
    Objective-C实现sha256算法(附完整源码)
    查看>>
    Objective-C实现shell sort希尔排序算法(附完整源码)
    查看>>
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>
    Objective-C实现Skip List跳表算法(附完整源码)
    查看>>
    Objective-C实现slack message松弛消息算法(附完整源码)
    查看>>