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 相关文章推荐
example1.php
Oct 09 PHP
PHP Ajax中文乱码问题解决方法
Feb 27 PHP
PHP中PDO的错误处理
Sep 04 PHP
ThinkPHP令牌验证实例
Jun 18 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
PHP实现在线阅读PDF文件的方法
Jun 17 PHP
thinkphp3.x中变量的获取和过滤方法详解
May 20 PHP
ThinkPHP实现简单登陆功能
Apr 28 PHP
php封装的mongodb操作类代码
Aug 06 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
php mysql PDO 查询操作的实例详解
Sep 23 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
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
使用JavaScript检测Firefox浏览器是否启用了Firebug的代码
2010/12/28 Javascript
JS的replace方法介绍
2012/10/20 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
jQuery实现鼠标经过时出现隐藏层文字链接的方法
2015/10/12 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
AngularJS基础 ng-selected 指令简单示例
2016/08/03 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
深入理解React高阶组件
2017/09/28 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
Python操作mongodb数据库的方法详解
2018/12/08 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python输入错误后删除的方法
2019/10/12 Python
可持续未来的时尚基础:Alternative Apparel
2019/05/06 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
竞选班干部演讲稿400字
2014/08/20 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
先进个人材料怎么写
2014/12/30 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python