学习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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
通用PHP动态生成静态HTML网页的代码
Mar 04 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
CodeIgniter自定义控制器MY_Controller用法分析
Jan 20 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
php+iframe 实现上传文件功能示例
Mar 04 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
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
jQuery Dialog 弹出层对话框插件
2010/08/09 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
jquery offset函数应用实例
2012/11/14 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
js实现飞入星星特效代码
2014/10/17 Javascript
jQuery超酷平面式时钟效果代码分享
2020/03/30 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
vue中阻止click事件冒泡,防止触发另一个事件的方法
2018/02/08 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
Vue中的循环及修改差值表达式的方法
2019/08/29 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
python实现k-means聚类算法
2018/02/23 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python socket通信编程实现文件上传代码实例
2019/12/14 Python
flask项目集成swagger的方法
2020/12/09 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
大学生职业规划前言模板
2013/12/27 职场文书
创文明城市标语
2014/06/16 职场文书
上海世博会口号
2014/06/19 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
财务人员岗位职责
2015/02/03 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers