【IUser.php】
<?php /** * 策略模式 * 将一组特定的行为和算法封装成类,用来适应某些特定的上下文环境,实现从硬编码到解耦 * 应用举例:电商系统针对不同性别跳转到不同的商品类目,并展示不同的广告信息和商品信息 */ /** * 定义用户的接口 */ interface IUser { //展示广告信息 public function showAds(); //展示商品信息 public function showGoods(); }
【FemaleUser.class.php】
<?php /** * 策略模式 -- 女性用户的策略 */ require_once 'IUser.php'; class FemaleUser implements IUser { public function showAds() { return '女性用户的广告信息'; } public function showGoods() { return '面膜'; } }
【MaleUser.class.php】
<?php /** * 策略模式 -- 男用户的策略 */ require_once 'IUser.php'; class MaleUser implements IUser { public function showAds() { return '男性用户的广告信息'; } public function showGoods() { return 'iphone6s'; } }
【Strategy.class.php】
<?php /** * 策略模式的具体实现方法 */ require_once 'interface/IUser.php'; require_once 'interface/FemaleUser.class.php'; require_once 'interface/MaleUser.class.php'; class Strategy { protected $strategy; function show(){ $res = '广告:'.$this->strategy->showAds().'<br>'; $res .= '商品:'.$this->strategy->showGoods().'<br>'; return $res; } function setStrategy(IUser $stra) { $this->strategy = $stra; } }
【调用】
////【策略模式】 $celue = new Strategy(); $gender = 'female'; //假设现在是女性 if ($gender == 'female') { $straObj = new FemaleUser(); } else { $straObj = new MaleUser(); } $celue->setStrategy($straObj); echo $celue->show();