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

    你可能感兴趣的文章
    Oracle 中的 decode
    查看>>
    oracle 中表一对多取多方的最新的一条数据
    查看>>
    oracle 使用 PL/SQL Developer创建表并插入单条、多条数据
    查看>>
    oracle 使用leading, use_nl, rownum调优
    查看>>
    oracle 修改字段类型方法
    查看>>
    Oracle 修改数据库表数据提交之后进行回滚
    查看>>
    UML-总结
    查看>>
    oracle 内存参数示意图
    查看>>
    Oracle 写存储过程的一个模板还有一些基本的知识点
    查看>>
    UML- 配置图(部署图)
    查看>>
    oracle 切割字符串加引号_使用Clean() 去掉由函数自动生成的字符串中的双引号...
    查看>>
    Oracle 创建 DBLink 的方法
    查看>>
    oracle 创建job
    查看>>
    oracle 创建一个用户,只能访问指定的对象
    查看>>
    oracle 创建双向备份,Materialized View 物化视图实现 Oracle 表双向同步
    查看>>
    oracle 创建字段自增长——两种实现方式汇总
    查看>>
    Oracle 升级10.2.0.5.4 OPatch 报错Patch 12419392 Optional component(s) missing 解决方法
    查看>>
    oracle 可传输的表空间:rman
    查看>>
    Oracle 启动监听命令
    查看>>
    Oracle 启动阶段 OPEN
    查看>>