php设计模式之策略模式应用案例详解


Posted in PHP onJune 17, 2019

本文实例讲述了php设计模式之策略模式应用。分享给大家供大家参考,具体如下:

策略模式

定义:

策略模式定义一系列的算法,将每个算法封装起来,并让它们可以相互装换。策略模式让算法独立于使用它的客户而独立变化。

角色分析:

  1. 抽象策略角色:策略类,通常由一个接口或者抽象类实现;
  2. 具体策略角色:包装了相关的算法和行为;
  3. 环境角色:持有一个策略类的引用,最终给客户端用。

应用场景:

  1. 多个类只区别在表现行为不同,可以使用策略模式,在运行的时动态选择具体要执行的行为。
  2. 需要在不同情况下使用不同的策略(算法) ,或者策略还可能在未来用其他方式来实现。
  3. 对客户隐藏具策略(算法)的实现细节,彼此完全独立。

代码实现:

<?php
/**
 * Created by PhpStorm.
 * Author: zhaorui
 * Date: 2019/2/27
 * Time: 10:55
 */
header('Content-Type:text/html;charset=utf-8');
// 抽象策略接口
abstract class Strategy{
  abstract function wayToSchool();
}
//具体策略角色
class BikeStrategy extends Strategy{
  function wayToSchool()
  {
    echo "骑自行车去上学".PHP_EOL;
  }
}
class BusStrategy extends Strategy{
  function wayToSchool()
  {
    echo "乘公共汽车去上学".PHP_EOL;
  }
}
class TaxiStrategy extends Strategy{
  function wayToSchool()
  {
    echo "坐出租去上学".PHP_EOL;
  }
}
// 环境角色
class Context{
  private $strategy;
  function getStrategy($strategyName){
    try{
      $strategyReflection = new ReflectionClass($strategyName);
      $this->strategy = $strategyReflection->newInstance();
    }catch (ReflectionException $e){
      $this->strategy = "";
    }
  }
  function goToSchool(){
    $this->strategy->wayToSchool();
  }
}
// 测试
$context  = new Context();
$context->getStrategy('BusStrategy');
$context->goToSchool();

运行结果

乘公共汽车去上学

优点:

  1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
  2. 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
  3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

缺点:

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换而言之,策略模式只适用于客户端知道的所有的算法或行为的情况。
  2. 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成共享的,这样策略类实例可以被不同客户端使用。换而言之,可以使用享元模式来减少对象的数量。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
PHP迅雷、快车、旋风下载专用链转换代码
Jun 15 PHP
360通用php防护代码(使用操作详解)
Jun 18 PHP
php实现telnet功能示例
Apr 08 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
Yii2中YiiBase自动加载类、引用文件方法分析(autoload)
Jul 25 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
使用PHP+MySql实现微信投票功能实例代码
Sep 29 PHP
Laravel框架在本地虚拟机快速安装的方法详解
Jun 11 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 PHP
YII框架模块化处理操作示例
Apr 26 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 #PHP
PHP 并发场景的几种解决方案
Jun 14 #PHP
PHP 实现文件压缩解压操作的方法
Jun 14 #PHP
php反射学习之依赖注入示例
Jun 14 #PHP
php反射学习之不用new方法实例化类操作示例
Jun 14 #PHP
PHP反射学习入门示例
Jun 14 #PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
Jun 14 #PHP
You might like
php curl基本操作详解
2013/07/23 PHP
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
基于jQuery代码实现圆形菜单展开收缩效果
2017/02/13 Javascript
AngularJS实现单一页面内设置跳转路由的方法
2017/06/28 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
python计算最大优先级队列实例
2013/12/18 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
Python subprocess模块详细解读
2018/01/29 Python
python 制作自定义包并安装到系统目录的方法
2018/10/27 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
会计实习自我鉴定
2013/12/04 职场文书
岗位职责的构建方法
2014/02/01 职场文书
电气个人求职信范文
2014/02/04 职场文书
运动会稿件50字
2014/02/17 职场文书
投资意向书范本
2014/04/01 职场文书
大学第二课堂活动总结
2014/07/08 职场文书
公司庆典欢迎词
2015/01/26 职场文书
2016年大学光棍节活动总结
2016/04/05 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL
Python基础之字符串格式化详解
2021/04/21 Python
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA