学习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+DBM的同学录程序(4)
Oct 09 PHP
从网上搜到的phpwind 0day的代码
Dec 07 PHP
php+mysql分页代码详解
Mar 27 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
PHP的APC模块实现上传进度条
Oct 27 PHP
php实现面包屑导航例子分享
Dec 19 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
php 数据结构之链表队列
Oct 17 PHP
php xhprof使用实例详解
Apr 15 PHP
PHP 代码简洁之道(小结)
Oct 16 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
PHP编码转换
2012/11/05 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
php实现倒计时效果
2015/12/19 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
用JavaScript做简易的购物车的代码示例
2017/10/20 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
JSX在render函数中的应用详解
2019/09/04 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
Python help()函数用法详解
2014/03/11 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
详解Python发送邮件实例
2016/01/10 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
基于python实现语音录入识别代码实例
2020/01/17 Python
Pytorch转tflite方式
2020/05/25 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
高二生物教学反思
2014/01/27 职场文书
建材投资建议书
2014/05/16 职场文书
诚信考试标语
2014/06/24 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
申报材料格式
2014/12/30 职场文书