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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
PHP 类型转换函数intval
Jun 20 PHP
PHP 一个随机字符串生成代码
May 26 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
php实现curl模拟ftp上传的方法
Jul 29 PHP
ThinkPHP中数据操作案例分析
Sep 27 PHP
手把手编写PHP框架 深入了解MVC运行流程
Sep 19 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 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 FPDF类库应用实现代码
2009/03/20 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
php中类和对象:静态属性、静态方法
2017/04/09 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
php查询内存信息操作示例
2019/05/09 PHP
jquery 将disabled的元素置为enabled的三种方法
2009/07/25 Javascript
基于jQuery+HttpHandler实现图片裁剪效果代码(适用于论坛, SNS)
2011/09/02 Javascript
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
Python设计模式之代理模式实例
2014/04/26 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
Python调用百度根据经纬度查询地址的示例代码
2019/07/07 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
CSS图片翻转动画技术详解(IE也实现了)
2014/04/03 HTML / CSS
彼得罗夫美国官网:Peter Thomas Roth美国(青瓜面膜)
2017/11/05 全球购物
应届生服务员求职信
2013/10/31 职场文书
财务助理岗位职责
2013/11/10 职场文书
大二学习计划书范文
2014/04/27 职场文书
英语故事演讲稿
2014/04/29 职场文书
普通党员自我剖析材料
2014/10/07 职场文书
2014年科技工作总结
2014/11/26 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python