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的ob_start();控制您的浏览器cache!
Nov 25 PHP
php 什么是PEAR?(第二篇)
Mar 19 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
PHP中其实也可以用方法链
Nov 10 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
Jan 03 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
PHP token验证生成原理实例分析
Jun 05 PHP
PHP array_reverse() 函数原理及实例解析
Jul 14 PHP
php使用event扩展的io复用测试的示例
Oct 20 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之第九天
2006/10/09 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
jQuery代码优化 选择符篇
2011/11/01 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
代码获取历史上的今天发生的事
2014/04/11 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
Node.js和MongoDB实现简单日志分析系统
2015/04/25 Javascript
JavaScript动态创建form表单并提交的实现方法
2015/12/10 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python sorted函数的小练习及解答
2019/09/18 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
pytorch中的自定义数据处理详解
2020/01/06 Python
python如何实现复制目录到指定目录
2020/02/13 Python
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
酒鬼酒广告词
2014/03/21 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
党员干部群众路线个人整改措施
2014/09/18 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
活动费用申请报告
2015/05/15 职场文书
小马王观后感
2015/06/11 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL