学习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 session 预定义数组
Mar 16 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
PHP里的中文变量说明
Jul 23 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
Yii框架form表单用法实例
Dec 04 PHP
PHP设置进度条的方法
Jul 08 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
Aug 18 PHP
php简单实现多语言切换的方法
May 09 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 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解析html的实现代码
2011/08/08 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
ThinkPHP应用模式扩展详解
2014/07/16 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
js给selected添加options的方法
2015/05/06 Javascript
原生javascript实现匀速运动动画效果
2016/02/26 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
2016/05/26 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
微信小程序实现折叠展开效果
2018/07/19 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
Python检测网络延迟的代码
2018/05/15 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
Python OpenCV之图片缩放的实现(cv2.resize)
2019/06/28 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
python队列原理及实现方法示例
2019/11/27 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
python对execl 处理操作代码
2020/06/22 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
联想法国官方网站:Lenovo法国
2018/10/18 全球购物
大学生护理专业自荐信
2013/10/03 职场文书
中学政教处工作总结
2015/08/13 职场文书
婚礼答谢词范文
2015/09/29 职场文书
《给予树》教学反思
2016/03/03 职场文书
高一作文之乐趣
2019/11/21 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL