当前位置:首页 > PHP

php策略模式实现

2026-03-13 09:31:32PHP

策略模式简介

策略模式(Strategy Pattern)属于行为型设计模式,允许在运行时动态选择算法或行为。它将算法封装成独立的类,使得它们可以互相替换,而不影响客户端代码。

核心组成部分

  • 策略接口(Strategy Interface):定义所有具体策略的通用方法。
  • 具体策略类(Concrete Strategies):实现策略接口,提供具体的算法实现。
  • 上下文类(Context):持有一个策略对象的引用,通过接口与策略交互。

实现步骤

定义策略接口

创建一个接口或抽象类,声明策略的通用方法。

php策略模式实现

interface PaymentStrategy {
    public function pay(float $amount): void;
}

实现具体策略类

编写多个具体策略类,实现接口中的方法。

php策略模式实现

class CreditCardPayment implements PaymentStrategy {
    public function pay(float $amount): void {
        echo "Paying $amount via Credit Card.\n";
    }
}

class PayPalPayment implements PaymentStrategy {
    public function pay(float $amount): void {
        echo "Paying $amount via PayPal.\n";
    }
}

创建上下文类

上下文类通过策略接口与具体策略交互,提供设置策略的方法。

class ShoppingCart {
    private PaymentStrategy $paymentStrategy;

    public function setPaymentStrategy(PaymentStrategy $strategy): void {
        $this->paymentStrategy = $strategy;
    }

    public function checkout(float $amount): void {
        $this->paymentStrategy->pay($amount);
    }
}

客户端调用示例

动态切换策略并执行支付。

$cart = new ShoppingCart();

// 使用信用卡支付
$cart->setPaymentStrategy(new CreditCardPayment());
$cart->checkout(100.50);

// 切换为 PayPal 支付
$cart->setPaymentStrategy(new PayPalPayment());
$cart->checkout(75.25);

优势与适用场景

  • 优势:避免多重条件判断,提高代码扩展性,符合开闭原则。
  • 适用场景:需要动态切换算法(如支付方式、排序算法、数据压缩策略等)。

完整代码示例

interface PaymentStrategy {
    public function pay(float $amount): void;
}

class CreditCardPayment implements PaymentStrategy {
    public function pay(float $amount): void {
        echo "Paying $amount via Credit Card.\n";
    }
}

class PayPalPayment implements PaymentStrategy {
    public function pay(float $amount): void {
        echo "Paying $amount via PayPal.\n";
    }
}

class ShoppingCart {
    private PaymentStrategy $paymentStrategy;

    public function setPaymentStrategy(PaymentStrategy $strategy): void {
        $this->paymentStrategy = $strategy;
    }

    public function checkout(float $amount): void {
        $this->paymentStrategy->pay($amount);
    }
}

// 客户端代码
$cart = new ShoppingCart();
$cart->setPaymentStrategy(new CreditCardPayment());
$cart->checkout(100.50);

$cart->setPaymentStrategy(new PayPalPayment());
$cart->checkout(75.25);

通过以上实现,可以灵活扩展新的支付方式(如新增 BitcoinPayment 类),而无需修改上下文类。

标签: 策略模式
分享给朋友:

相关文章

如何启用react并发模式

如何启用react并发模式

启用 React 并发模式的方法 React 并发模式(Concurrent Mode)是 React 18 引入的一项功能,允许应用在渲染过程中保持响应性。以下是启用并发模式的步骤: 安装 Rea…

react实现mvvm模式

react实现mvvm模式

React 实现 MVVM 模式的方法 MVVM(Model-View-ViewModel)是一种前端架构模式,通过数据绑定实现视图与逻辑的分离。React 本身基于单向数据流设计,但可以通过以下方式…

php调试模式实现

php调试模式实现

PHP调试模式实现方法 开启PHP调试模式可以帮助开发者在开发过程中快速定位和解决问题。以下是几种常见的实现方法: 使用ini_set函数动态开启 在PHP脚本中动态开启错误报告和显示错误: in…

js 实现单例模式

js 实现单例模式

使用闭包实现单例模式 闭包可以封装私有变量,确保实例唯一性。通过立即执行函数返回一个获取实例的方法,首次调用时创建实例,后续调用直接返回已创建的实例。 const Singleton = (func…

uniapp生产模式

uniapp生产模式

uniapp生产模式配置与优化 环境配置 确保HBuilderX版本为最新稳定版,安装必要的插件和依赖。检查manifest.json文件中的基础配置,包括应用名称、版本号、图标等基础信息。 修改项…

单例模式的实现PHP

单例模式的实现PHP

单例模式的基本概念 单例模式确保一个类只有一个实例,并提供一个全局访问点。适用于需要全局唯一对象的场景,如数据库连接、日志管理等。 PHP 单例模式的实现步骤 私有化构造函数 防止外部通过 ne…