php策略模式核心是解耦算法、明确职责、便于替换,接口轻量稳定、策略单一职责、工厂简单可控、策略间完全独立。

PHP策略模式的实现规范核心是“解耦算法、明确职责、便于替换”,不是为用而用,而是当业务逻辑开始出现多分支、难复用、不敢改时的自然选择。
接口定义要轻量且稳定
策略接口只声明一个核心方法(如 isValid() 或 process()),不带多余参数或返回类型约束过死。避免把上下文、日志、缓存等非核心行为塞进接口里。例如:
- ✅ 接口只需
public function validate($value, $context = []): bool; - ❌ 不要写成
public function validate($value, $request, $logger, $cache): ValidationResult; - 接口一旦发布,尽量不修改——新增需求靠加新策略类,而不是改老接口
具体策略类必须单一职责
每个策略类只解决一个问题,且不依赖全局状态。它不读 $_POST、不查 $_SESSION、不硬编码数据库连接——所有外部依赖都通过构造函数注入,所有运行时数据都由调用方通过 $context 显式传入。
- ✅
EmailValidator只做格式校验;UniqueEmailValidator才负责查库去重 - ✅ 密码强度检查拆成
MinLengthValidator、HasNumberValidator等多个小策略 - ❌ 不要在策略里 new PDO 或直接调用 config() 函数
工厂或上下文要简单可控
策略选择逻辑应极简:用字符串匹配、枚举或配置映射即可,别在工厂里查数据库、读远程配置、做复杂路由判断。那已不属于策略模式范畴,而是上层调度问题。
- ✅ 工厂用
match或数组映射,返回新实例:return match($channel) { 'alipay' => new AlipayStrategy(), ... }; - ✅ 上下文类(如
PaymentContext)只持有一个策略引用,专注委托执行 - ❌ 工厂里写
if (isProduction()) { ... } else { ... }或调用Config::get('payment.strategy')
策略间禁止互相调用或继承
策略之间应完全独立,不构成父子关系,也不彼此组合调用。若发现两个策略逻辑高度相似,说明抽象层级可能错了——要么合并,要么提取共用工具方法到服务类,而不是让策略 A 依赖策略 B。
- ✅ 共用正则、格式化、HTTP 请求等能力,抽成独立 service 类,通过构造函数注入
- ❌
class StrongPasswordValidator extends PasswordValidator - ❌
$this->emailValidator->isValid($email)出现在另一个策略内部
不复杂但容易忽略:策略模式的价值不在结构多漂亮,而在每次加规则时,你只新建一个类、写一个方法、跑一个单元测试——改得安心,扩得清楚。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











