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

 更新时间:2019年06月17日 11:23:06   作者:赵筱蕊  
这篇文章主要介绍了php设计模式之策略模式,结合具体应用案例形式详细分析了php策略模式的原理、定义、实现方法及项目应用案例与操作注意事项,需要的朋友可以参考下

本文实例讲述了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面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

相关文章

  • mac下多个php版本快速切换的方法

    mac下多个php版本快速切换的方法

    这篇文章主要给大家介绍了在mac下多个php版本快速切换的方法,本文先是给大家分享了使用brew安装php多版本的方法,而后才介绍了快速切换的实现方法,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • php生成zip压缩文件的方法详解

    php生成zip压缩文件的方法详解

    本篇文章是对php生成zip压缩文件的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 有关PHP中MVC的开发经验分享

    有关PHP中MVC的开发经验分享

    经过近一个月对MVC的研究,自己也通过网上有朋友的指导,有了一套自己的MVC流程及框架,但是感觉缺限还是很多,灵活性方面还是欠缺,但又不知道怎么样的具体改进,今天我就把我的流程及思想发布,希望有高人能够指点指点
    2012-05-05
  • PHP编程计算日期间隔天数的方法

    PHP编程计算日期间隔天数的方法

    这篇文章主要介绍了PHP编程计算日期间隔天数的方法,涉及php日期与时间的转换与运算相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • PHP漏洞全解(详细介绍)

    PHP漏洞全解(详细介绍)

    针对PHP的网站主要存在下面几种攻击方式,这里介绍下,大家在书写php代码的时候一定要注意下
    2012-11-11
  • PHP之COOKIE支持详解

    PHP之COOKIE支持详解

    建立商业站点或者功能比较完善的个人站点,常常需要记录访问者的信息,在PHP中提供了两种方便的手段:session和cookie功能.为了永久的保持用户信息,则cookie是最便捷的手段.在这里我将为大家详细的讲解cookie的功能及使用方法.
    2010-09-09
  • PHP二维数组去重算法

    PHP二维数组去重算法

    本文给大家分享的代码是php实现的二维数组根据键值合并并去重复的算法,非常实用,有需要的小伙伴可以参考下
    2016-12-12
  • php base64 编码与解码实例代码

    php base64 编码与解码实例代码

    这篇文章主要介绍了php base64 编码与解码实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • PHP中if和or运行效率对比

    PHP中if和or运行效率对比

    这篇文章主要介绍了PHP中if和or运行效率对比,有助于深入了解PHP程序中相近语句的效率对比,对于编写高质量的PHP程序有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • php 获取mysql数据库信息代码

    php 获取mysql数据库信息代码

    有时候我们需要知道mysql数据库中的一些情况,好在php提供了一些内置方法与函数,大家了解下了。
    2009-03-03

最新评论