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面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
Sep 12 PHP
php实现的替换敏感字符串类实例
Sep 22 PHP
浅析iis7.5安装配置php环境
May 10 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
php中Redis的应用--消息传递
Mar 28 PHP
Yii2使用表单上传文件的实例代码
Aug 03 PHP
php strftime函数获取日期时间(switch用法)
May 16 PHP
php设计模式之适配器模式原理、用法及注意事项详解
Sep 24 PHP
PHP7 标准库修改
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
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
javascript动态修改Li节点值的方法
2015/01/20 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JavaScript实现上下浮动的窗口效果代码
2015/10/12 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
BootStrap栅格系统、表单样式与按钮样式源码解析
2017/01/20 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
python实现简单socket通信的方法
2016/04/19 Python
Python实现Linux中的du命令
2017/06/12 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
基于numpy.random.randn()与rand()的区别详解
2018/04/17 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python3 flask实现文件上传功能
2020/03/20 Python
python实现顺序表的简单代码
2018/09/28 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python中实现栈的三种方法
2020/12/19 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
班长岗位职责
2013/11/10 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
老公给老婆的保证书
2014/04/28 职场文书
社会公德演讲稿
2014/05/20 职场文书
基层党支部承诺书
2015/04/30 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
对Keras自带Loss Function的深入研究
2021/05/25 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers