在项目研发中,设计模式是一种经过验证的解决方案,用于解决软件开发中常见的对象创建、交互和职责分配等问题。下面我们将以 PHP 为例,展示 策略模式(Strategy Pattern) 在实际项目中的使用方式,并通过一个具体的场景进行代码演示。

🛍️ 一、场景:电商促销活动中根据订单金额应用不同折扣策略

假设我们正在开发一个电商平台,需要根据用户的订单金额应用不同的折扣策略:

  • 订单金额 ≥ 2000 → 打八折;
  • 订单金额 ≥ 500 且 < 2000 → 打九折;
  • 订单金额 < 500 → 打九五折。

🧩 二、使用策略模式的结构

策略模式的核心思想是:

  • 定义一个策略接口,所有策略类实现该接口;
  • 每个策略类封装不同的业务逻辑;
  • 通过**上下文类(Context)**动态切换策略;
  • 客户端使用上下文对象调用策略行为,无需关心具体实现。

🧱 三、代码实现(PHP)

1. 定义策略接口

<?php

interface DiscountStrategy {
    public function applyDiscount(float $amount): float;
}

2. 实现具体策略类

<?php

// 八折策略
class EightDiscount implements DiscountStrategy {
    public function applyDiscount(float $amount): float {
        return $amount * 0.8;
    }
}

// 九折策略
class NineDiscount implements DiscountStrategy {
    public function applyDiscount(float $amount): float {
        return $amount * 0.9;
    }
}

// 九五折策略
class NineFiveDiscount implements DiscountStrategy {
    public function applyDiscount(float $amount): float {
        return $amount * 0.95;
    }
}

3. 创建策略上下文类

<?php

class DiscountContext {
    private DiscountStrategy $strategy;

    public function setStrategy(DiscountStrategy $strategy): void {
        $this->strategy = $strategy;
    }

    public function calculate(float $amount): float {
        return $this->strategy->applyDiscount($amount);
    }
}

4. 客户端调用示例

<?php

$context = new DiscountContext();

$amount = 2500;

if ($amount >= 2000) {
    $context->setStrategy(new EightDiscount());
} elseif ($amount >= 500) {
    $context->setStrategy(new NineDiscount());
} else {
    $context->setStrategy(new NineFiveDiscount());
}

$finalAmount = $context->calculate($amount);
echo "原始金额: $amount\n";
echo "最终金额: $finalAmount\n";

✅ 5、 输出结果(当金额为 2500 时)

原始金额: 2500
最终金额: 2000

🌟 四、设计模式的优势

  • 解耦:策略模式将算法与调用者分离,客户端不依赖具体实现;
  • 可扩展性强:新增策略只需添加新类,无需修改已有逻辑;
  • 便于维护:每个策略职责单一,易于测试和调试;
  • 符合开闭原则(对扩展开放,对修改关闭)。

📌 五、PHP 特点补充

PHP 是一种动态语言,策略模式非常适合其灵活的面向对象特性。你可以:

  • 使用接口实现多态;
  • 利用依赖注入(如通过框架如 Laravel)管理策略类的实例;
  • 使用匿名函数或闭包实现更轻量的策略逻辑(适用于简单场景)。

✅ 六、总结

在 PHP 项目中使用设计模式,尤其是策略模式,可以显著提升代码的可维护性和可扩展性。通过将不同折扣策略封装为独立类,我们避免了冗长的 if-else 分支,使得系统更易于理解和扩展。

💡 提示:在实际项目中,可以结合 PHP 框架(如 Laravel)使用服务容器进行策略的自动注入和管理,进一步提升开发效率。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐