策略模式(Strategy Pattern)作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。
比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
策略模式是一种对象行为型模式。
策略模式包含如下角色:
订单系统中不同类型的客户有不同的结算方式;
不同商家的打折优惠模式不同;
替换继承关系,避免使用多重条件转移语句,扩展性良好
客户端必须知道所有策略类,并自行决定使用哪一种策略类。
如果算法较多,则会造成很多的策略类。
<?php// 策略接口interface IStrategy{ public function algorithMethod();}// 具体策略实现class ConcreteStrategy implements IStrategy{ public function algorithMethod(){ echo "this is ConcreteStrategy method...<br>"; }}class ConcreteStrategy2 implements IStrategy{ public function algorithMethod(){ echo "this is ConcreteStrategy2 method...<br>"; }}class ConcreteStrategy3 implements IStrategy{ public function algorithMethod(){ echo "this is ConcreteStrategy3 method...<br>"; }}// 策略上下文class StrategyContext{ public $strategy = null; // 使用构造器注入具体的策略类 public function __construct(IStrategy $strategy){ $this->strategy = $strategy; } public function contextMethod(){ // 调用策略实现的方法 $this->strategy->algorithMethod(); }}// 客户端调用// 1. 创建具体策略实现$strategy = new ConcreteStrategy2();// 2. 创建策略上下文的同时,将具体的策略实现对象注入到策略上下文中$ctx = new StrategyContext($strategy);// 3. 调用上下文对象的方法来完成对具体策略实现的回调$ctx->contextMethod();
输出:
this is ConcreteStrategy2 method…
原文链接:https://www.ryanzoe.top/%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f/php-strategy-mode/