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 相关文章推荐
FleaPHP的安全设置方法
Sep 15 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
PHP 变量定义和变量替换的方法
Jul 30 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
php ckeditor上传图片文件名乱码解决方法
Nov 15 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
php 中奖概率算法实现代码
Jan 25 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
php成功操作redis cluster集群的实例教程
Jan 13 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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桌面中心(三) 修改数据库
2007/03/11 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
优化网页之快速的呈现我们的网页
2007/06/29 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
jquery获取img的src值的简单实例
2016/05/17 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
Vue 中使用 typescript的方法详解
2020/02/17 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
财务总监管理职责范文
2014/03/09 职场文书
小学生操行评语大全
2014/04/22 职场文书
授权委托书格式范文
2014/08/02 职场文书
2015年教师节新闻稿
2015/07/17 职场文书
军训决心书范文
2015/09/22 职场文书
学术会议开幕词
2016/03/03 职场文书
mysql 8.0.24 安装配置方法图文教程
2021/05/12 MySQL