02、PHP 设计模式-策略模式

策略模式

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

组成

1、 抽象策略角色:策略类,通常由一个接口或者抽象类实现;
2、 具体策略角色:包装了相关的算法和行为;
3、 环境角色:持有一个策略类的引用,最终给客户端调用;

实现

结构图

 

步骤

1、 定义抽象角色类(定义好各个实现的共同抽象方法);
2、 定义具体策略类(具体实现父类的共同方法);
3、 定义环境角色类(接收保存实例,统一执行策略类接口方法);

PHP代码实现

<?php
// 策略接口
interface StrategyInterface {
    public function doOperation(int $num1, int $num2): int;
}

// 具体策略类:加法策略
class OperationAdd implements StrategyInterface {
    public function doOperation(int $num1, int $num2): int {
        return $num1 + $num2;
    }
}

// 具体策略类:减法策略
class OperationSubtract implements StrategyInterface {
    public function doOperation(int $num1, int $num2): int {
        return $num1 - $num2;
    }
}

// 具体策略类:乘法策略
class OperationMultiply implements StrategyInterface {
    public function doOperation(int $num1, int $num2): int {
        return $num1 * $num2;
    }
}

// 上下文类
class Context {
    private $strategy;

    public function __construct(StrategyInterface $strategy) {
        $this->strategy = $strategy;
    }

    public function executeStrategy(int $num1, int $num2): int {
        return $this->strategy->doOperation($num1, $num2);
    }
}

// 客户端代码
$contextAdd = new Context(new OperationAdd());
echo "10 + 5 = " . $contextAdd->executeStrategy(10, 5) . PHP_EOL;

$contextSubtract = new Context(new OperationSubtract());
echo "10 - 5 = " . $contextSubtract->executeStrategy(10, 5) . PHP_EOL;

$contextMultiply = new Context(new OperationMultiply());
echo "10 * 5 = " . $contextMultiply->executeStrategy(10, 5) . PHP_EOL;