php設計模式 Strategy(策略模式)
抽象策略(Strategy)角色:定義所有支持的算法的公共接口。通常是以一個接口或抽象來實現(xiàn)。Context使用這個接口來調(diào)用其ConcreteStrategy定義的算法。
具體策略(ConcreteStrategy)角色:以Strategy接口實現(xiàn)某具體算法。
環(huán)境(Context)角色:持有一個Strategy類的引用,用一個ConcreteStrategy對象來配置

核心代碼
<?php
interface Strategy { // 抽象策略角色,以接口實現(xiàn)
public function algorithmInterface(); // 算法接口
}
class ConcreteStrategyA implements Strategy { // 具體策略角色A
public function algorithmInterface() {}
}
class ConcreteStrategyB implements Strategy { // 具體策略角色B
public function algorithmInterface() {}
}
class ConcreteStrategyC implements Strategy { // 具體策略角色C
public function algorithmInterface() {}
}
class Context { // 環(huán)境角色
private $_strategy;
public function __construct(Strategy $strategy) {
$this->_strategy = $strategy;
}
public function contextInterface() {
$this->_strategy->algorithmInterface();
}
}
// client
$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->contextInterface();
$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->contextInterface();
$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->contextInterface();
其他代碼
<?php
/**
* 策略模式(Strategy.php)
*
* 定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換,使用得算法的變化可獨立于使用它的客戶
*
*/
// ---以下是一系列算法的封閉----
interface CacheTable
{
public function get($key);
public function set($key,$value);
public function del($key);
}
// 不使用緩存
class NoCache implements CacheTable
{
public function __construct(){
echo "Use NoCache<br/>";
}
public function get($key)
{
return false;
}
public function set($key,$value)
{
return true;
}
public function del($key)
{
return false;
}
}
// 文件緩存
class FileCache implements CacheTable
{
public function __construct()
{
echo "Use FileCache<br/>";
// 文件緩存構(gòu)造函數(shù)
}
public function get($key)
{
// 文件緩存的get方法實現(xiàn)
}
public function set($key,$value)
{
// 文件緩存的set方法實現(xiàn)
}
public function del($key)
{
// 文件緩存的del方法實現(xiàn)
}
}
// TTServer
class TTCache implements CacheTable
{
public function __construct()
{
echo "Use TTCache<br/>";
// TTServer緩存構(gòu)造函數(shù)
}
public function get($key)
{
// TTServer緩存的get方法實現(xiàn)
}
public function set($key,$value)
{
// TTServer緩存的set方法實現(xiàn)
}
public function del($key)
{
// TTServer緩存的del方法實現(xiàn)
}
}
// -- 以下是使用不用緩存的策略 ------
class Model
{
private $_cache;
public function __construct()
{
$this->_cache = new NoCache();
}
public function setCache($cache)
{
$this->_cache = $cache;
}
}
class UserModel extends Model
{
}
class PorductModel extends Model
{
public function __construct()
{
$this->_cache = new TTCache();
}
}
// -- 實例一下 ---
$mdlUser = new UserModel();
$mdlProduct = new PorductModel();
$mdlProduct->setCache(new FileCache()); // 改變緩存策略
?>
具體的大家可以多關(guān)注一下腳本之家以前發(fā)布的文章
相關(guān)文章
關(guān)于PHPDocument 代碼注釋規(guī)范的總結(jié)
本篇文章是對PHPDocument代碼注釋規(guī)范進行了詳細的總結(jié)與介紹,需要的朋友參考下2013-06-06
解析php中array_merge與array+array的區(qū)別
調(diào)整優(yōu)化您的LAMP應用程序的5種簡單方法

