学习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 生成WML页面方法详解
Aug 09 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
浅析PHP 按位与或 (^ 、&amp;)
Jun 21 PHP
php中如何防止表单的重复提交
Aug 02 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php可应用于面包屑导航的迭代寻找家谱树实现方法
Feb 02 PHP
php使用unset()删除数组中某个单元(键)的方法
Feb 17 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
详解php用static方法的原因
Sep 12 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懒人函数 自动添加数据
2011/06/28 PHP
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
php上传文件问题汇总
2015/01/30 PHP
php中session定期自动清理的方法
2015/11/12 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
通过AJAX的JS、JQuery两种方式解析XML示例介绍
2013/09/23 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
2017/03/04 Javascript
微信小程序 五星评分的实现实例
2017/08/04 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
2019/04/29 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
[02:11]2016国际邀请赛中国区预选赛全程回顾
2016/07/01 DOTA
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python列表推导式与生成器用法分析
2018/08/02 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
美国高端医师级美容产品电商:BeautifiedYou.com
2017/04/17 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
党建工作先进材料
2014/05/02 职场文书
大型演出策划方案
2014/05/28 职场文书
四风查摆剖析材料
2014/10/10 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript