学习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实现文件安全下载
Oct 09 PHP
PHP脚本的10个技巧(2)
Oct 09 PHP
实现dedecms全站URL静态化改造的代码
Mar 29 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
php ci框架中加载css和js文件失败的解决方法
Mar 03 PHP
php过滤敏感词的示例
Mar 31 PHP
Smarty中常用变量操作符汇总
Oct 27 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
PHP有序表查找之插值查找算法示例
Feb 10 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
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
php 中序列化和json使用介绍
2013/07/08 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
Javascript闭包实例详解
2015/11/29 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
深入理解jQuery.data() 的实现方式
2016/11/30 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
python常用函数详解
2016/09/13 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
python实现猜拳游戏
2020/03/04 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
国贸专业个人求职信范文
2014/01/08 职场文书
施工材料员岗位职责
2014/02/12 职场文书
计算机专业自荐信范文
2014/05/28 职场文书
拉歌口号大全
2014/06/13 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
龙门石窟导游词
2015/02/02 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers