学习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 30 PHP
php smarty 二级分类代码和模版循环例子
Jun 16 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
php数组中删除元素之重新索引的方法
Sep 16 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
php编程每天必学之验证码
Mar 03 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 PHP
PHP 断点续传实例详解
Nov 11 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
php将xml转化对象的实例详解
Nov 17 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中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
PHP中的密码加密的解决方案总结
2016/10/26 PHP
use jscript List Installed Software
2007/06/11 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
2016/12/30 Javascript
javascript定时器取消定时器及优化方法
2017/07/08 Javascript
webpack学习教程之前端性能优化总结
2017/12/05 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python生成随机密码
2015/03/10 Python
Python安装第三方库的3种方法
2015/06/21 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
Python函数默认参数常见问题及解决方案
2020/03/26 Python
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
业务部门经理岗位职责
2014/02/23 职场文书
企业文化宣传标语
2014/06/09 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python