抽象策略(Strategy)角色:定義所有支持的算法的公共接口。通常是以一個接口或抽象來實現。Context使用這個接口來調用其ConcreteStrategy定義的算法。
具體策略(ConcreteStrategy)角色:以Strategy接口實現某具體算法。
環境(Context)角色:持有一個Strategy類的引用,用一個ConcreteStrategy對象來配置
核心代碼
- <?php
- interface Strategy { // 抽象策略角色,以接口實現
- 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 { // 環境角色
- 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/>";
- // 文件緩存構造函數
- }
- public function get($key)
- {
- // 文件緩存的get方法實現
- }
- public function set($key,$value)
- {
- // 文件緩存的set方法實現
- }
- public function del($key)
- {
- // 文件緩存的del方法實現
- }
- }
- // TTServer
- class TTCache implements CacheTable
- {
- public function __construct()
- {
- echo "Use TTCache<br/>";
- // TTServer緩存構造函數
- }
- public function get($key)
- {
- // TTServer緩存的get方法實現
- }
- public function set($key,$value)
- {
- // TTServer緩存的set方法實現
- }
- public function del($key)
- {
- // TTServer緩存的del方法實現
- }
- }
- // -- 以下是使用不用緩存的策略 ------
- 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()); // 改變緩存策略
- ?>
具體的大家可以多關注一下服務器之家以前發布的文章