重构复杂简单变量之状态与策略模式

状态与策略模式 主要用于消除复杂的类型代码,并将其替换为更清晰、可维护的状态或策略对象。这个方法通常用于以下情况:

  1. 类型代码问题:当我们在类中使用整数或字符串来表示对象的状态或行为时,这可能会导致代码变得难以理解和维护。每当状态变化时,我们都需要在代码中进行大量的条件判断。
  2. 状态/策略模式 :
    • 状态模式:允许对象在内部状态改变时改变其行为。通过将每种状态抽象为一个类,我们可以避免复杂的条件语句。
    • 策略模式:定义一系列算法,将每个算法封装起来,并使它们可以互换。这种模式让算法独立于使用它的客户端。

实施步骤

  1. 识别类型代码:首先,识别出需要重构的类型代码。例如,某个类中的整数常量用来表示不同的状态。
  2. 创建状态/策略类 :
    • 对于状态模式,创建一个抽象状态类,并为每种状态实现一个子类。
    • 对于策略模式,创建一个接口,并为每种策略实现相应的类。
  3. 替换条件语句:用状态/策略对象替代原有的条件判断逻辑。这意味着在类中不再直接使用类型代码,而是使用状态/策略对象来处理行为。
  4. 更新客户端代码:确保使用新状态/策略对象的代码能正常工作。

示例

假设我们有一个简单的订单类,使用整数表示订单状态:

csharp 复制代码
public class Order {
    public const int NEW = 0;
    public const int PROCESSING = 1;
    public const int COMPLETED = 2;
    
    private int status;

    public void Process() {
        if (status == NEW) {
            // 处理新订单
            status = PROCESSING;
        } else if (status == PROCESSING) {
            // 完成订单处理
            status = COMPLETED;
        }
    }
}

我们可以将其重构为状态模式:

csharp 复制代码
public interface IOrderState {
    void Process(Order order);
}

public class NewOrderState : IOrderState {
    public void Process(Order order) {
        // 处理新订单
        order.SetState(new ProcessingOrderState());
    }
}

public class ProcessingOrderState : IOrderState {
    public void Process(Order order) {
        // 完成订单处理
        order.SetState(new CompletedOrderState());
    }
}

public class CompletedOrderState : IOrderState {
    public void Process(Order order) {
        // 已完成,无法再次处理
    }
}

public class Order {
    private IOrderState state;

    public Order() {
        state = new NewOrderState();
    }

    public void SetState(IOrderState newState) {
        state = newState;
    }

    public void Process() {
        state.Process(this);
    }
}

优势

  • 可读性:代码更易于理解,状态逻辑被封装在独立的类中。
  • 可维护性:增加新状态或行为时,只需添加新的类,而不必修改现有代码。
  • 灵活性:能够动态改变对象的状态或行为,而无需重构客户端代码。

这种重构方法特别适合在项目中使用,当我们发现类型代码导致代码复杂且难以维护时,考虑使用状态或策略模式来重构我们的代码。

相关推荐
小O的算法实验室9 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
笨笨饿1 天前
#141_ Codex 本地 AI 代理工具链工作流重构:Headroom、Scrapling、Archify 统一接入
开发语言·人工智能·stm32·单片机·嵌入式硬件·ui·重构
JieDavid2 天前
奇智创达知识产权管理系统期限监控模块实操,告别人工期限疏漏,实现管理闭环!
大数据·运维·人工智能·经验分享·重构
蜗牛互联网2 天前
Computer Use公共预览的安全设计:应用、动作与数据三维门禁
java·人工智能·后端·安全·策略模式
凤城老人2 天前
从PyQt6到Electron:一款英语字帖生成器的跨平台重构实战与踩坑全记录
javascript·重构·electron
兰亭妙微UI设计公司3 天前
兰亭妙微UI设计公司 蚂蚁阿福APP拆解:对话式交互如何重构就医全流程?
重构·交互
今年下半年3 天前
【Spring Boot】多种存储文件(FastDFS / MinIO / 阿里云 OSS)接入设计说明(附源码)
spring boot·分布式·中间件·简单工厂模式·策略模式
科技研学社3 天前
2026外贸新规+订单重构:内衣内裤工厂,自动化如何应对供应链洗牌
运维·重构·自动化
火山引擎和TA的超级拍档们4 天前
地上铁×火山引擎:从埋点采集到万物Agent,AI 重构新能源物流全生命周期
人工智能·重构·火山引擎
银河技术4 天前
TB级文本去重实战:从单机 OOM 到 Spark / Ray 分布式架构的工程演进
分布式·微服务·重构·架构·spark·llm·rag