php设计模式 Strategy(策略模式)


Posted in PHP onJune 26, 2011

抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法。

具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法。

环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置

php设计模式 Strategy(策略模式)

核心代码

<?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()); // 改变缓存策略 
?>

 具体的大家可以多关注一下三水点靠木以前发布的文章

PHP 相关文章推荐
php预定义常量
Dec 25 PHP
表单复选框向PHP传输数据的代码
Nov 13 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
input file获得文件根目录简单实现
Apr 26 PHP
php获取apk包信息的方法
Aug 15 PHP
在win7中搭建Linux+PHP 开发环境
Oct 08 PHP
php中file_get_contents与curl性能比较分析
Nov 08 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
PHP array_shift()用法实例分析
Jan 07 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
基于laravel belongsTo使用详解
Oct 18 PHP
php设计模式 Observer(观察者模式)
Jun 26 #PHP
php设计模式 Singleton(单例模式)
Jun 26 #PHP
php设计模式 Command(命令模式)
Jun 26 #PHP
php设计模式 Template (模板模式)
Jun 26 #PHP
php设计模式 Proxy (代理模式)
Jun 26 #PHP
php设计模式 Composite (组合模式)
Jun 26 #PHP
php设计模式 State (状态模式)
Jun 26 #PHP
You might like
php中static静态变量的使用方法详解
2010/06/04 PHP
PHP 通过Socket收发十六进制数据的实现代码
2013/08/16 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
老生常谈javascript中逻辑运算符&amp;&amp;和||的返回值问题
2017/04/13 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
JavaScript实现的搜索及高亮显示功能示例
2017/08/14 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
python进阶教程之循环相关函数range、enumerate、zip
2014/08/30 Python
为python设置socket代理的方法
2015/01/14 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
python实现简易云音乐播放器
2018/01/04 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
Python接口测试数据库封装实现原理
2020/05/09 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
战友聚会邀请函
2014/01/18 职场文书
春季防火方案
2014/05/10 职场文书
体操比赛口号
2014/06/10 职场文书
经济类毕业生求职信
2014/06/26 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python