PHP设计模式之策略模式

实现步骤:
1. 定义抽象角色类( 各个具体的实现类的公共的抽象方法 )
2. 定义具体角色类( 各个实现了公共抽象方法的具体类 )
3. 定义环境角色
场景:
假设有一个购物车,加入里面的商品的价格根据用户的level不同而用不同的折扣计算,比如,普通用户不打折,中级用户7折,vip用户5折。
第一:定义抽象角色类,不同的用户有不同的折算,也就是获取价格这个行为会根据不同的用户而不同,把这个行为封装成一个接口
<?php 
/**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */
namespace price;
interface getPriceClass{
	public function getPrice($price);
}

第二:定义具体角色类,有三种角色的用户,分别都要实现行为接口

<?php
/**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */
namespace user;
class normalUserClass implements \price\getPriceClass{
	public function getPrice($price){
		return $price;
	}
}
<?php
/**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */
namespace user;
class intermediateUserClass implements \price\getPriceClass{
	public function getPrice($price){
		return $price*0.7;
	}
}
<?php
/**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */
namespace user;
class vipUserClass implements \price\getPriceClass{
	public function getPrice($price){
		return $price*0.5;
	}
}

第三:定义上下文环境角色

<?php
/**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */
namespace price;
class priceClass{
	private $user;

	public function __construct($user){
		$this->user = $user;
	}

	public function compute($price){
		return $this->user->getPrice($price);
	}
}

第四:测试

<?php
 /**
  * Strategy Pattern
  *
  * @category  PHP
  * @author    jahng
  * @copyright 
  * @link      http://www.jahng.cn
  */

require_once('./Autoload.class.php');
$price = 100;

$priceObj = new \price\priceClass(new \user\normalUserClass());
echo 'normal user price =>'.$priceObj->compute($price).'<br>';

$priceObj = new \price\priceClass(new \user\intermediateUserClass());
echo 'intermediate user price =>'.$priceObj->compute($price).'<br>';

$priceObj = new \price\priceClass(new \user\vipUserClass());
echo 'vip user price =>'.$priceObj->compute($price).'<br>';


第五:

点击下载源码