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 相关文章推荐
第五节 克隆 [5]
Oct 09 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
Oct 25 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
2014年最新推荐的10款 PHP 开发框架
Aug 01 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
phpcms的分类名称和类别名称的调用
Jan 05 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
Smarty缓存机制实例详解【三种缓存方式】
Jul 20 PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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网站在线人数统计
2008/04/09 PHP
php中计算程序运行时间的类代码
2012/11/03 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
关于document.cookie的使用javascript
2008/04/11 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
python3抓取中文网页的方法
2015/07/28 Python
python生成二维码的实例详解
2017/10/29 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
selenium+python实现1688网站验证码图片的截取功能
2018/08/14 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python 搜索大文件的实例代码
2019/07/08 Python
如何基于python操作json文件获取内容
2019/12/24 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
使用Keras实现简单线性回归模型操作
2020/06/12 Python
HTML5 视频播放(video),JavaScript控制视频的实例代码
2018/10/08 HTML / CSS
口腔医学技术应届生求职信
2013/11/09 职场文书
员工拾金不昧表扬信
2014/01/09 职场文书
小学教师师德反思
2014/02/03 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
淘宝活动总结范文
2014/06/26 职场文书
给老婆的道歉信
2015/01/20 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
k-means & DBSCAN 总结
2021/04/27 Python