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在字符串中查找另一个字符串
Nov 19 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 PHP
Zend Framework基本页面布局分析
Mar 19 PHP
php简单复制文件的方法
May 09 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
PHP实现蛇形矩阵,回环矩阵及数字螺旋矩阵的方法分析
May 29 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 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 基于文件头的文件类型验证类函数
2012/05/01 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
php中mt_rand()随机数函数用法
2014/11/24 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
JavaScript中document.forms[0]与getElementByName区别
2015/01/21 Javascript
JS hashMap实例详解
2016/05/26 Javascript
angularJS Provider、factory、service详解及实例代码
2016/09/21 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
python提取页面内url列表的方法
2015/05/25 Python
Python实现删除列表中满足一定条件的元素示例
2017/06/12 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
2019/12/18 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
10个示例带你掌握python中的元组
2020/11/23 Python
利用python进行文件操作
2020/12/04 Python
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
《掌声》教学反思
2014/02/23 职场文书
乡镇纠风工作实施方案
2014/03/22 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
协议书范本
2014/04/23 职场文书
娱乐节目策划方案
2014/06/10 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
党小组评议意见
2015/06/02 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书