学习php设计模式 php实现策略模式(strategy)


Posted in PHP onDecember 07, 2015

一、意图
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化
策略模式变化的是算法
二、策略模式结构图

学习php设计模式 php实现策略模式(strategy) 

三、策略模式中主要角色
抽象策略(Strategy)角色:定义所有支持的算法的公共接口。通常是以一个接口或抽象来实现。Context使用这个接口来调用其ConcreteStrategy定义的算法
具体策略(ConcreteStrategy)角色:以Strategy接口实现某具体算法
环境(Context)角色:持有一个Strategy类的引用,用一个ConcreteStrategy对象来配置
四、策略模式的优点和缺点
策略模式的优点:
1、策略模式提供了管理相关的算法族的办法
2、策略模式提供了可以替换继承关系的办法 将算封闭在独立的Strategy类中使得你可以独立于其Context改变它
3、使用策略模式可以避免使用多重条件转移语句。
策略模式的缺点:
1、客户必须了解所有的策略 这是策略模式一个潜在的缺点
2、Strategy和Context之间的通信开销
3、策略模式会造成很多的策略类
五、策略模式适用场景
1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法
2、需要使用一个算法的不同变体。
3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构
4、一个类定义了多种行为,并且 这些行为在这个类的操作中以多个形式出现。将相关的条件分支移和它们各自的Strategy类中以代替这些条件语句
六、策略模式与其它模式
Template模式:模板方法模式与策略模式的不同在于,策略模式使用委派的方法提供不同的算法行为,而模板方法使用继承的方法提供不同的算法行为
享元模式(flyweight模式):如果有多个客户端对象需要调用 同样的一睦策略类的话,就可以使它们实现享元模式
七、策略模式PHP示例

<?php
/**
 * 抽象策略角色,以接口实现
 */
interface Strategy {
 
  /**
   * 算法接口
   */
  public function algorithmInterface();
}
 
/**
 * 具体策略角色A
 */
class ConcreteStrategyA implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface A<br />';
  }
}
 
/**
 * 具体策略角色B
 */
class ConcreteStrategyB implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface B<br />';
  }
}
 
/**
 * 具体策略角色C
 */
class ConcreteStrategyC implements Strategy {
 
  public function algorithmInterface() {
    echo 'algorithmInterface C<br />';
  }
}
 
/**
 * 环境角色
 */
class Context {
  /* 引用的策略 */
  private $_strategy;
 
  public function __construct(Strategy $strategy) {
    $this->_strategy = $strategy;
  }
 
  public function contextInterface() {
    $this->_strategy->algorithmInterface();
  }
 
}
 
/**
 * 客户端
 */
class Client {
 
  /**
   * Main program.
   */
  public static function main() {
    $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();
  }
 
}
 
Client::main();
?>

以上就是使用php实现策略模式的代码,还有一些关于策略模式的概念区分,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(五)
Sep 05 PHP
php 用sock技术发送邮件的函数
Jul 21 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
对淘宝URL中ID提取的PHP代码
Sep 01 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
带你了解PHP7 性能翻倍的关键
Nov 19 PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 PHP
将PHP的session数据存储到数据库中的代码实例
Jun 24 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
学习php设计模式 php实现状态模式
Dec 07 #PHP
学习php设计模式 php实现适配器模式
Dec 07 #PHP
分享五个PHP7性能优化提升技巧
Dec 07 #PHP
学习php设计模式 php实现工厂模式(factory)
Dec 07 #PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 #PHP
PHP中Enum(枚举)用法实例详解
Dec 07 #PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 #PHP
You might like
用PHP和ACCESS写聊天室(二)
2006/10/09 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php进程间通讯实例分析
2016/07/11 PHP
PHP下载远程图片的几种方法总结
2017/04/07 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
javascript下高性能字符串连接StringBuffer类
2010/08/16 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
js DOM的学习笔记
2011/12/22 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
WebPack基础知识详解
2017/01/16 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
Vue之Watcher源码解析(1)
2017/07/19 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
Angular利用内容投射向组件输入ngForOf模板的方法
2018/03/05 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
Python GAE、Django导出Excel的方法
2008/11/24 Python
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
python套接字流重定向实例汇总
2016/03/03 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
2020/05/12 Python
Python程序慢的重要原因
2020/09/04 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
python破解同事的压缩包密码
2020/10/14 Python
留学生如何写好自荐信
2013/12/27 职场文书
工作总结与自我评价
2014/09/18 职场文书
2014年校长工作总结
2014/12/11 职场文书
护理专业自荐信范文
2015/03/06 职场文书
职工宿舍管理制度
2015/08/05 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书