php设计模式-策略模式
php设计模式-策略模式
1.概念:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
2.组成部分:
a.抽象策略角色: 策略类,通常由一个接口或者抽象类实现
b.具体策略角色:包装了相关的算法和行为。
c.环境角色:持有一个策略类的引用,最终给客户端调用。
3.解决的问题:
a.电商中运费的处理 网站邀请注册 等处理
4.结构图
![php设计模式-策略模式 php设计模式-策略模式](http://s10.sinaimg.cn/mw690/81ad0841gd37724a41239&690)
a.抽象策略角色: 策略类,通常由一个接口或者抽象类实现
b.具体策略角色:包装了相关的算法和行为。
c.环境角色:持有一个策略类的引用,最终给客户端调用。
3.解决的问题:
a.电商中运费的处理 网站邀请注册 等处理
4.结构图
1 class Activity { 2 private $strategy; //用于保存策略实例 3 public $strategyName = 'DEFAULTActivityStrategy'; 4 public function __construct($strategyName) { 5 if(!empty($strategyName)){ 6 $this->strategyName = $strategyName; 7 } 8 $this->strategy = AbstractActivityStrategy::getInstance($this->strategyName); //加载策略类 9 } 10 public function addLog() { 11 $data = array('id'=>'uid','event'=>'eventName'); // 添加到数据库的数据 12 $this->strategy->addLog($data); 13 } 14 } 15 16 abstract class AbstractActivityStrategy 17 { 18 abstract public function addLog($data); 19 public static function getInstance($strategyName) 20 { 21 return new $strategyName; 22 } 23 } 24 25 /\** 26 * 策略具体类 27 */ 28 class DEFAULTActivityStrategy extends AbstractActivityStrategy { 29 public function addLog($data) { 30 $activityLog = new ActivityLog(); 31 $activityLog->save($data); 32 $activityLogAmount = new ActivityLogAmount(); //计数类 33 $activityLogAmount->countValue += 1; 34 $activityLogAmount->save(); 35 } 36 } 37 /\** 38 * 活动日志具体类 39 */ 40 class ActivityLog { 41 42 public function save($data) 43 { 44 echo "数据保存到数据库 45 "; 46 } 47 } 48 /\** 49 * 活动计数具体类 50 */ 51 class ActivityLogAmount { 52 public $countValue; //邀请记录数 53 public function __construct() 54 { 55 $this->countValue = 0; 56 } 57 public function save() 58 { 59 echo "推荐次数为".$this->countValue; 60 } 61 } 62 63 64 $activity = new Activity(null); 65 $activity->addLog();