PHP 怎么PHP 策略类

wen PHP项目 2

本文目录导读:

PHP 怎么PHP 策略类

  1. 基本实现方式
  2. 进阶实现:使用枚举和工厂模式
  3. 实际应用场景示例
  4. 策略模式的优点
  5. 适用场景
  6. 注意事项

我来详细解释PHP中的策略模式(Strategy Pattern)的实现方法。

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。

基本实现方式

定义策略接口

<?php
// 策略接口
interface PaymentStrategy {
    public function pay($amount);
}
?>

实现具体策略类

<?php
// 支付宝支付策略
class AlipayStrategy implements PaymentStrategy {
    public function pay($amount) {
        echo "使用支付宝支付:{$amount}元\n";
        // 支付宝具体的支付逻辑
    }
}
// 微信支付策略
class WechatPayStrategy implements PaymentStrategy {
    public function pay($amount) {
        echo "使用微信支付:{$amount}元\n";
        // 微信具体的支付逻辑
    }
}
// 银行卡支付策略
class BankCardStrategy implements PaymentStrategy {
    public function pay($amount) {
        echo "使用银行卡支付:{$amount}元\n";
        // 银行卡具体的支付逻辑
    }
}
?>

创建上下文类

<?php
// 上下文类
class PaymentContext {
    private $strategy;
    public function __construct(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }
    public function setStrategy(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }
    public function executePayment($amount) {
        $this->strategy->pay($amount);
    }
}
?>

使用示例

<?php
// 客户端代码
$payment = new PaymentContext(new AlipayStrategy());
$payment->executePayment(100); // 使用支付宝支付100元
// 动态切换策略
$payment->setStrategy(new WechatPayStrategy());
$payment->executePayment(200); // 使用微信支付200元
$payment->setStrategy(new BankCardStrategy());
$payment->executePayment(300); // 使用银行卡支付300元
?>

进阶实现:使用枚举和工厂模式

<?php
// 支付类型枚举
enum PaymentType: string {
    case ALIPAY = 'alipay';
    case WECHAT = 'wechat';
    case BANK_CARD = 'bank_card';
}
// 策略工厂
class PaymentStrategyFactory {
    private static $strategies = [
        PaymentType::ALIPAY->value => AlipayStrategy::class,
        PaymentType::WECHAT->value => WechatPayStrategy::class,
        PaymentType::BANK_CARD->value => BankCardStrategy::class,
    ];
    public static function create(PaymentType $type): PaymentStrategy {
        $className = self::$strategies[$type->value];
        return new $className();
    }
}
// 简化的上下文类
class SimplePaymentContext {
    public function processPayment(PaymentType $type, $amount) {
        $strategy = PaymentStrategyFactory::create($type);
        $strategy->pay($amount);
    }
}
// 使用
$context = new SimplePaymentContext();
$context->processPayment(PaymentType::ALIPAY, 500);
$context->processPayment(PaymentType::WECHAT, 600);
?>

实际应用场景示例

文件上传策略

<?php
// 文件上传策略接口
interface UploadStrategy {
    public function upload($file);
}
// 本地存储策略
class LocalUploadStrategy implements UploadStrategy {
    public function upload($file) {
        // 本地文件保存逻辑
        move_uploaded_file($file['tmp_name'], './uploads/' . $file['name']);
        return "本地路径: /uploads/" . $file['name'];
    }
}
// 阿里云OSS策略
class AliyunOssUploadStrategy implements UploadStrategy {
    public function upload($file) {
        // 阿里云OSS上传逻辑
        return "阿里云OSS: bucket/..." . $file['name'];
    }
}
// 七牛云存储策略
class QiniuUploadStrategy implements UploadStrategy {
    public function upload($file) {
        // 七牛云上传逻辑
        return "七牛云: ..." . $file['name'];
    }
}
// 上传管理器
class FileUploadManager {
    private $strategy;
    public function __construct(UploadStrategy $strategy) {
        $this->strategy = $strategy;
    }
    public function upload($file) {
        return $this->strategy->upload($file);
    }
}
// 使用示例
$uploader = new FileUploadManager(new LocalUploadStrategy());
$result = $uploader->upload($_FILES['file']);
echo "上传结果: " . $result;
?>

策略模式的优点

  1. 开闭原则:增加新策略无需修改原有代码
  2. 避免多重条件语句:替代大量的 if-else 或 switch
  3. 提高代码复用性:策略类可以被复用
  4. 算法可以自由切换:运行时动态改变行为

适用场景

  • 多个类只是行为不同时
  • 需要避免使用多重条件判断
  • 算法可以相互替换
  • 系统需要动态选择算法

注意事项

  1. 策略数量过多时,可以考虑结合工厂模式
  2. 客户端需要了解不同策略的区别
  3. 策略模式会增加对象数量

这种设计模式在电商系统、支付系统、文件处理系统等场景中非常常见且实用。

抱歉,评论功能暂时关闭!