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 相关文章推荐
通过ICQ网关发送手机短信的PHP源程序
Oct 09 PHP
PHP 抓取网页图片并且另存为的实现代码
Mar 24 PHP
浅谈PHP调用Webservice思路及源码分享
Jun 04 PHP
PHP CURL 内存泄露问题解决方法
Feb 12 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
php实现屏蔽掉黑帽SEO的搜索关键字
Apr 15 PHP
WordPress中获取页面链接和标题的相关PHP函数用法解析
Dec 17 PHP
Yii2针对指定url的生成及图片等的引入方法小结
Jul 18 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
php实现商城购物车的思路和源码分析
Jul 23 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
php解析http获取的json字符串变量总是空白null
2015/03/02 PHP
js表数据排序 sort table data
2009/02/18 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
Jquery练习之表单验证实现代码
2010/12/14 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
通过JS获取Request.QueryString()参数的值实现方法
2016/09/27 Javascript
详解AngularJS验证、过滤器、指令
2017/01/04 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
Python创建系统目录的方法
2015/03/11 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
Python编程实现使用线性回归预测数据
2017/12/07 Python
python机器学习实战之K均值聚类
2017/12/20 Python
python利用百度AI实现文字识别功能
2018/11/27 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python笔记之代理模式
2019/11/20 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
住房公积金接收函
2014/01/09 职场文书
事业单位考核材料
2014/05/21 职场文书
装修施工安全责任书
2014/07/24 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
二审代理词范文
2015/05/25 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
初三语文教学反思
2016/03/03 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android