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中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
php流量统计功能的实现代码
Sep 29 PHP
div li的多行多列 无刷新分页示例代码
Oct 16 PHP
关于js和php对url编码的处理方法
Mar 04 PHP
php实现中文字符截取防乱码方法汇总
Apr 29 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
PHP sleep()函数, usleep()函数
Aug 25 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
Yii2.0实现生成二维码功能实例
Oct 24 PHP
PHP使用Redis长连接的方法详解
Feb 12 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调用C#开发的dll类库方法
2014/07/28 PHP
PHP实现文件上传与下载
2020/08/28 PHP
JS实现浏览器菜单命令
2006/09/05 Javascript
js 学习笔记(三)
2009/12/29 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
认识jQuery的Promise的具体使用方法
2017/10/10 jQuery
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
Python入门教程之if语句的用法
2015/05/14 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
django开发教程之利用缓存文件进行页面缓存的方法
2017/11/10 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
英语硕士生求职简历的自我评价
2013/10/15 职场文书
还款承诺书范文
2014/05/20 职场文书
运动会演讲稿50字
2014/08/25 职场文书
信用卡逾期证明示例
2014/09/13 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
酒店管理专业毕业生自我鉴定
2014/09/29 职场文书
个人委托函范文
2015/01/29 职场文书
党员活动总结
2015/02/04 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
力克胡哲观后感
2015/06/10 职场文书
Oracle中DBLink的详细介绍
2022/04/29 Oracle
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS