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 相关文章推荐
php 301转向实现代码
Sep 18 PHP
php 正则 过滤html 的超链接
Jun 02 PHP
php 记录进行累加并显示总时长为秒的结果
Nov 04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
PHP callback函数使用方法和注意事项
Jan 23 PHP
PHP封装CURL扩展类实例
Jul 28 PHP
php根据用户语言跳转相应网页
Nov 04 PHP
PHP实现QQ空间自动回复说说的方法
Dec 02 PHP
ThinkPHP3.2.3实现分页的方法详解
Jun 03 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
php7 新增功能实例总结
May 25 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
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
利用fecha进行JS日期处理
2016/11/21 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
webpack配置文件和常用配置项介绍
2017/04/28 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
微信小程序之绑定点击事件实例详解
2017/07/07 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
Promise.all中对于reject的处理方法
2018/08/01 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
微信小程序实现左侧滑栏过程解析
2019/08/26 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
python中eval与int的区别浅析
2019/08/11 Python
使用python实现名片管理系统
2020/06/18 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
文明家庭先进事迹材
2014/01/27 职场文书
工会工作先进事迹
2014/08/18 职场文书
2014年团支部工作总结
2014/11/17 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书