策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中,将行为转换为对象,以使算法的对象能够相互替换。
实现方式
1、从上下文类中找出修改频率较高的算法 (也可能是用于在运行时选择某个算法变体的复杂条件运算符)。
2、声明该算法所有变体的通用策略接口。
3、将算法逐一抽取到各自的类中, 它们都必须实现策略接口。
4、在上下文类中添加一个成员变量用于保存对于策略对象的引用。 然后提供设置器以修改该成员变量。 上下文仅可通过策略接口同策略对象进行交互, 如有需要还可定义一个接口来让策略访问其数据。
5、客户端必须将上下文类与相应策略进行关联, 使上下文可以预期的方式完成其主要工作。
代码示例
<?php //定义算法及抽象实现 interface strategy { function algorithmInterface(); } class concreteStrategyA implements strategy { function algorithmInterface() { echo '算法A'; } } class concreteStrategyB implements strategy { function algorithmInterface() { echo '算法B'; } } //定义上下文执行环境 class context { //成员变量,用来存储对策略的引用 private $strategy; function __construct(strategy $s) { $this->strategy = $s; } function contextInterface() { $this->strategy->algorithmInterface(); } } //客户端调用不同算法(客户端自行选择合适的策略) $strategyA = new concreteStrategyA(); $context = new context($strategyA); $context->contextInterface(); //算法A $strategyB = new concreteStrategyB(); $context = new context($strategyB); $context->contextInterface(); //算法B
适用场景
- 随时切换不同算法逻辑
- 业务逻辑与算法细节区分开来
好文章要分享: