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 相关文章推荐
用sql命令修改数据表中的一个字段为非空(not null)的语句
Jun 04 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
PHP小教程之实现链表
Jun 09 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
php微信开发之批量生成带参数的二维码
Jun 26 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
php 人员权限管理(RBAC)实例(推荐)
May 24 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
PHP Ajax跨域问题解决方案代码实例
Aug 01 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
FleaPHP的安全设置方法
2008/09/15 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
探讨如何把session存入数据库
2013/06/07 PHP
PHP实现递归无限级分类
2015/10/22 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
ZendFramework框架实现连接两个或多个数据库的方法
2016/12/08 PHP
javascript 当前日期加(天、周、月、年)
2009/08/09 Javascript
javascript for循环从入门到偏门(效率优化+奇特用法)
2012/08/01 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
Vue父子组件之间的通信实例详解
2018/09/28 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
Pandas之groupby( )用法笔记小结
2019/07/23 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
外贸采购员岗位职责
2014/03/08 职场文书
公司合作意向书
2014/04/01 职场文书
校园广播稿精选
2014/10/01 职场文书
融资合作协议书范本
2014/10/17 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书