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中Session的概念
Oct 09 PHP
PHP实现定时生成HTML网站首页实例代码
Nov 20 PHP
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
php操作redis缓存方法分享
Jun 03 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
Laravel框架路由和控制器的绑定操作方法
Jun 12 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
Feb 15 PHP
Laravel中Kafka的使用详解
Mar 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
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
php实现记事本案例
2020/10/20 PHP
js onpropertychange输入框 事件获取属性
2009/03/26 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
2016/10/15 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
从零学习node.js之mysql数据库的操作(五)
2017/02/24 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
基于vue实现分页效果
2017/11/06 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
线程和进程的区别及Python代码实例
2015/02/04 Python
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
Python使用django搭建web开发环境
2017/06/09 Python
Python+OpenCV人脸检测原理及示例详解
2020/10/19 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
Python将文字转成语音并读出来的实例详解
2019/07/15 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
市政施工员自我鉴定
2014/01/15 职场文书
高中语文教学反思
2014/01/16 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
试用期自我评价范文
2015/03/10 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
婚宴领导致辞
2015/07/28 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL
解决 redis 无法远程连接
2022/05/15 Redis
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android