首先编写一个基类接口用于定义策略规范及实现逻辑方法
/**
* 策略公共接口
* 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();
这样就可以动态扩展多个策略,动态去调用某个具体策略去执行,起到最终程序解耦的效果,应用场景包括支付对接、计划执行等等。