学习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 相关文章推荐
PHP5新特性: 更加面向对象化的PHP
Nov 18 PHP
PHP获取数组中某元素的位置及array_keys函数应用
Jan 29 PHP
解析php中如何直接执行SHELL
Jun 28 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
PHP生成plist数据的方法
Jun 16 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
php多线程并发实现方法
Sep 30 PHP
Yii2中简单的场景使用介绍
Jun 02 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
js DOM的学习笔记
2011/12/22 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
javascript在子页面中函数无法调试问题解决方法
2014/01/17 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
小程序自定义日历效果
2018/12/29 Javascript
validform表单验证的实现方法
2019/03/08 Javascript
Promise扫盲贴
2019/06/24 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
2020/03/26 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
学生信息管理系统python版
2018/10/17 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
金融专业个人的自我评价
2013/10/18 职场文书
计算机科学技术自荐信
2014/06/12 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015元旦节寄语
2014/12/08 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
建国大业观后感
2015/06/01 职场文书
入学证明
2015/06/23 职场文书
结婚纪念日感言
2015/08/01 职场文书
董事长秘书工作总结
2015/08/14 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android