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 相关文章推荐
session在PHP大型web应用中的使用
Jun 25 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
php cookie使用方法学习笔记分享
Nov 07 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
linux下编译安装memcached服务
Aug 03 PHP
php数组比较实现查找连续数的方法
Jul 29 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
Nov 10 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
php png失真的原因及解决办法
Nov 17 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检测图片木马多进制编程实践
2013/04/11 PHP
如何使用Strace调试工具
2013/06/03 PHP
php封装的page分页类完整实例
2016/10/18 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
Django日志模块logging的配置详解
2017/02/14 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
《欢乐的泼水节》教学反思
2014/04/22 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
股权投资协议书
2016/03/23 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS