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 相关文章推荐
通过table标签,PHP输出EXCEL的实现方法
Jul 24 PHP
php while循环得到循环次数
Oct 26 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php实现的简单美国商品税计算函数
Jul 13 PHP
ubuntu下配置nginx+php+mysql详解
Sep 10 PHP
Thinkphp框架开发移动端接口(1)
Aug 18 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
浅谈PHP安全防护之Web攻击
Jan 03 PHP
PHP编程实现脚本异步执行的方法
Aug 09 PHP
thinkPHP中钩子的使用方法实例分析
Nov 16 PHP
PHP __call()方法实现委托示例
May 20 PHP
php apache开启跨域模式过程详解
Jul 08 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
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
javascript new fun的执行过程
2010/08/05 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
jquery easyui 结合jsp简单展现table数据示例
2014/04/18 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
Javascript实现颜色rgb与16进制转换的方法
2015/04/18 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
Node.js返回JSONP详解
2016/05/18 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
pygame学习笔记(2):画点的三种方法和动画实例
2015/04/15 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
Pytorch 实现sobel算子的卷积操作详解
2020/01/10 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
CSS3 简单又实用的5个属性
2010/03/04 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
标准毕业生自荐信
2014/06/24 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
夫妻分居协议书范本(有子女版)
2014/11/01 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技