首先编写一个基类接口用于定义策略规范及实现逻辑方法

/**
 * 策略公共接口
 * Interface MyBaseStrategy
 */
interface MyBaseStrategy
{
    /**
     * 定义执行实现逻辑
     */
    public function makeImplementation() : void;
}

接着编写一个策略处理类用于统一执行策略的实现逻辑(这步其实应该可省略吧,但我觉得定义一个处理类更好一些)

/**
 * 策略处理类
 * Class ImplementationHandler
 */
class ImplementationHandler
{
    /**
     * 使用PHP8构造方法新特性绑定具体计划实现策略类
     * @param MyBaseStrategy $strategy 具体计划实现策略类
     */
    public function __construct(
        private MyBaseStrategy $strategy
    ){}

    /**
     * 执行实现逻辑
     */
    public function makeImplementation() : void
    {
        $this->strategy->makeImplementation();
    }
}

再编写好策略生成的工厂类(其实应该算是策略模式+工厂模式了,不过一般都是两者一同使用的)

/**
 * 策略生成工厂类
 * Class ImplementationFactory
 */
class ImplementationFactory
{
    /**
     * 生成对应的策略
     * @param string $name the plan name
     * @return MyBaseStrategy
     */
    public static function getPlanOfImplementationInstance(string $name) : MyBaseStrategy
    {
        $className = 'My' . $name . 'PlanImplementationStrategy';

        if (!class_exists($className)) {
            throw new InvalidArgumentException('This plan is not exists');
        }

        return new $className();
    }
}

最后编写具体策略实现

/**
 * A计划实现策略类
 * Class MyAPlanImplementationStrategy
 */
class MyAPlanImplementationStrategy implements MyBaseStrategy
{
    /**
     * 实现逻辑
     */
    public function makeImplementation() : void
    {
        echo 'This is my a plan class of implementation function' . PHP_EOL;
    }
}

调用策略的时候,就可以配合工厂类及处理类去动态生成策略实现类来执行逻辑

try {
    // 根据工厂对象创建A计划具体实现类
    $plan = ImplementationFactory::getPlanOfImplementationInstance('A');
} catch (Exception $exception) {
    echo $exception->getMessage() . PHP_EOL;
}

// 传入实例给策略处理类
$handler = new ImplementationHandler($plan);
// 执行计划
$handler->makeImplementation();

这样就可以动态扩展多个策略,动态去调用某个具体策略去执行,起到最终程序解耦的效果,应用场景包括支付对接、计划执行等等。