设计模式与代码重构

很多开发者第一次接触设计模式,都会有一个疑问:
"我现在代码也能跑,为啥还要用设计模式?"

答案往往出现在后期:当需求变化、代码膨胀、维护成本越来越高时,你会发现------
重构,几乎不可避免。

而设计模式,正是代码重构中最常用、最可靠的工具之一。


一、什么是代码重构

代码重构(Refactoring)指的是:

在不改变代码外部行为的前提下,改善代码内部结构。

它解决的问题包括:

  • 代码重复严重
  • 逻辑混乱、if-else 满天飞
  • 类职责不清,一个类什么都干
  • 改一个需求,牵一大片代码

重构不是"重写",而是逐步演进式优化


二、没有设计模式的代码长什么样

先看一个常见的"坏味道"示例:

python 复制代码
def pay(order, pay_type):
    if pay_type == "wechat":
        print("使用微信支付")
    elif pay_type == "alipay":
        print("使用支付宝支付")
    elif pay_type == "bank":
        print("使用银行卡支付")
    else:
        raise ValueError("不支持的支付方式")

问题在哪里?

  • 每新增一种支付方式,都要修改这个函数
  • if-elif 不断膨胀
  • 不符合开闭原则

三、用设计模式驱动重构

1. 第一步:识别变化点

上面代码中,变化的是什么?

支付方式在变化,而支付流程本身是稳定的。

这正是使用设计模式的信号。


2. 第二步:引入策略模式进行重构

python 复制代码
from abc import ABC, abstractmethod

class Payment(ABC):
    @abstractmethod
    def pay(self, order):
        pass


class WeChatPay(Payment):
    def pay(self, order):
        print("使用微信支付")


class AliPay(Payment):
    def pay(self, order):
        print("使用支付宝支付")


class BankPay(Payment):
    def pay(self, order):
        print("使用银行卡支付")

使用策略:

python 复制代码
def process_pay(order, payment: Payment):
    payment.pay(order)

新增支付方式时:

  • 新增一个类
  • 无需修改原有逻辑

四、设计模式在重构中的作用

设计模式在重构过程中,通常承担以下角色:

1. 消除重复代码

  • 提取公共逻辑
  • 通过模板方法、策略模式复用结构

2. 替代复杂条件判断

  • if-else → 策略模式 / 状态模式
  • 多分支处理 → 责任链模式

3. 解耦模块依赖

  • 直接依赖具体类 → 依赖抽象
  • 使用工厂、代理、中介者模式降低耦合

4. 提供可扩展点

  • 新功能通过新增类实现
  • 避免"牵一发动全身"的修改风险

五、重构不是一开始就用设计模式

一个常见误区是:

"写代码前就要套设计模式。"

实际上:

  • 小项目:过度设计反而降低效率
  • 需求不明确时:先写清晰代码更重要
  • 变化出现后:再引入设计模式重构

更合理的方式是:

先让代码跑起来 → 再让代码跑得久。


六、如何在实际项目中使用设计模式重构

实用建议:

  1. 先写清晰、可读的代码

  2. 出现以下信号时,考虑重构:

    • if-else 超过 3 层
    • 类的方法越来越多
    • 修改一个需求影响多个模块
  3. 从最小范围开始重构

  4. 用测试保障重构安全

  5. 引入最简单可用的模式


七、总结

设计模式不是目的,而是手段

它们最大的价值在于:

  • 指导你如何重构代码
  • 帮助代码在变化中保持稳定
  • 让系统更容易理解、维护和扩展

在后续的专栏中,你会看到:
几乎每一个设计模式,都是为了解决重构中的某类问题而存在。

相关推荐
qetfw几秒前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
用户8356290780511 小时前
Python 实现 Excel 页面布局与打印设置自动化
后端·python
一次旅行1 小时前
Python+大模型端到端自动化日报系统
开发语言·python·自动化
_Jimmy_1 小时前
AI应用开发工程师面试题库
人工智能·python·深度学习·机器学习·知识图谱
用户8356290780511 小时前
Python 实现 Excel 命名范围(Named Range)的创建与管理
后端·python
了不起的云计算V1 小时前
破局“Demo陷阱”:中国电子云以“新星”AI重构关键行业智能决策体系
人工智能·重构
dreamer_83992 小时前
AI智能合同比对系统:从零搭建实战教程
人工智能·python
杨充2 小时前
11.DDD与战术建模
设计模式·开源·代码规范
杨充2 小时前
12.综合实战图片框架
设计模式·开源·代码规范
AOwhisky3 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发