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 中执行系统外部命令
Oct 09 PHP
详解:――如何将图片储存在数据库里
Dec 05 PHP
php下通过POST还是GET来传值
Jun 05 PHP
在PHP中检查PHP文件是否有语法错误的方法
Dec 23 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
php 魔术方法详解
Nov 11 PHP
smarty内置函数capture用法分析
Jan 22 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
PHP微信开发之有道翻译
Jun 23 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 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像数组一样存取和修改字符串字符
2014/03/21 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
php封装json通信接口详解及实例
2017/03/07 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
React Native验证码倒计时工具类分享
2017/10/24 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python实现用户登陆邮件通知的方法
2015/07/09 Python
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
Python错误处理操作示例
2018/07/18 Python
如何在django中实现分页功能
2020/04/22 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
建筑工程质量通病防治方案
2014/06/08 职场文书
关于安全的广播稿
2014/10/23 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
mysql中between的边界,范围说明
2021/06/08 MySQL
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers