• php设计模式之策略模式详解


    策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在PHP中应用策略模式可以让你轻松地根据需要选择和交换算法或策略,而无需修改使用这些算法的代码。

    策略模式的核心概念:

    目的:
    • 定义一系列算法,将每个算法封装起来,并让它们可以互相替换。
    • 让算法的变化独立于使用算法的客户,减少代码间的耦合。
    主要参与者:
    1. 策略接口(Strategy Interface):定义所有支持的策略或行为的公共接口。这通常是一个抽象类或接口。

    2. 具体策略(Concrete Strategies):实现了策略接口的具体类,每一个类封装了一种具体的算法或行为。

    3. 上下文(Context):持有一个策略对象的引用,通过上下文可以调用策略对象的算法。上下文不直接决定使用哪种策略,而是通过构造函数、设置器等方法传递进来。

    PHP实现示例:

    假设我们要实现一个简单的支付系统,其中包含多种支付策略(如支付宝、微信支付、银行卡支付)。

    1. 定义策略接口:
    1. interface PaymentStrategy {
    2. public function pay($amount);
    3. }
    1. 具体策略类:
    1. class AlipayStrategy implements PaymentStrategy {
    2. public function pay($amount) {
    3. echo "Paid $amount using Alipay.\n";
    4. }
    5. }
    6. class WechatPayStrategy implements PaymentStrategy {
    7. public function pay($amount) {
    8. echo "Paid $amount using Wechat Pay.\n";
    9. }
    10. }
    11. class BankCardStrategy implements PaymentStrategy {
    12. public function pay($amount) {
    13. echo "Paid $amount using Bank Card.\n";
    14. }
    15. }
    1. 上下文类:
    1. class PaymentContext {
    2. protected $strategy;
    3. public function __construct(PaymentStrategy $strategy) {
    4. $this->strategy = $strategy;
    5. }
    6. public function executePayment($amount) {
    7. $this->strategy->pay($amount);
    8. }
    9. }
    1. 客户端代码:
    1. // 客户端可以根据需要选择支付策略
    2. $context = new PaymentContext(new AlipayStrategy());
    3. $context->executePayment(100);
    4. // 动态切换支付策略
    5. $context = new PaymentContext(new WechatPayStrategy());
    6. $context->executePayment(200);

    优点:

    • 易于扩展:添加新的策略不需要修改原有代码,只需添加新的策略类即可。
    • 提高代码复用性:相同的行为可以在不同的环境中重用。
    • 增加灵活性:运行时决定使用哪种策略,提高了系统的灵活性。

    应用场景:

    • 当有多种算法实现相似功能,且这些算法可能在未来需要互换时。
    • 需要动态选择算法时,如用户可选择的不同排序或过滤规则。
    • 不希望在高层模块中充斥大量条件语句来决定使用哪种算法时。
  • 相关阅读:
    Redis实战:高效键值存储与缓存解决方案
    设计模式:模板方法模式
    vmware的Linux虚拟机创建新的卷组VG
    C/C++ 语言怎么保留n位小数并且四舍五入
    vue3的api解读-VUE Reactivity
    Acwing 829. 模拟队列
    二叉搜索树【理论+代码】
    Ubuntu安装任意版本的cuda和cudnn
    windows 安装配置GO开发环境
    Yakit单兵作战神器简单使用
  • 原文地址:https://blog.csdn.net/jkzyx123/article/details/139411884