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 相关文章推荐
PHP4实际应用经验篇(8)
Oct 09 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
用PHP写的基于Memcache的Queue实现代码
Nov 27 PHP
PHP file_exists问题杂谈
May 07 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
PHP给源代码加密的几种方法汇总(推荐)
Feb 06 PHP
laravel 实现划分admin和home 模块分组
Oct 15 PHP
PHP7移除的扩展和SAPI
Mar 09 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中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
理解Javascript_09_Function与Object
2010/10/16 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
2013/11/19 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
深入理解JavaScript系列(27):设计模式之建造者模式详解
2015/03/03 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
简单三步实现报表页面集成天气
2016/12/15 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
详解vue高级特性
2020/06/09 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
python 命名规范知识点汇总
2020/02/14 Python
Python post请求实现代码实例
2020/02/28 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
Python通过len函数返回对象长度
2020/10/22 Python
scrapy在python爬虫中搭建出错的解决方法
2020/11/22 Python
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
顶岗实习接收函
2014/01/09 职场文书
问卷调查计划书
2014/01/10 职场文书
大学生个人事迹材料
2014/01/21 职场文书
大学生活动总结模板
2014/07/02 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
师德师风自我剖析材料
2014/09/27 职场文书
学术研讨会欢迎词
2015/01/26 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
深入浅析React中diff算法
2021/05/19 Javascript