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通用分页类page.php[仿google分页]
Aug 31 PHP
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
Sep 10 PHP
使用PHP会话(Session)实现用户登陆功能
Jun 29 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
PHP生成各种常见验证码和Ajax验证过程
Jan 10 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 PHP
使用PHP免费发送定时短信的实例
Oct 24 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 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/01/15 PHP
php下把数组保存为文件格式的实例应用
2010/02/08 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
2012/09/30 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
JavaScript实现梯形乘法表的方法
2015/04/25 Javascript
jquery通过name属性取值的简单实现方法
2016/06/20 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
2017/04/05 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
2019/12/10 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
Ant Design的可编辑Tree的实现操作
2020/10/31 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
python字符串替换第一个字符串的方法
2019/06/26 Python
python 对一幅灰度图像进行直方图均衡化
2020/10/27 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
Maisons du Monde德国:法国家具和装饰的市场领导者
2019/07/26 全球购物
TCP/IP的分层模型
2013/10/27 面试题
党课知识竞赛主持词
2014/04/01 职场文书
《狼和小羊》教学反思
2014/04/20 职场文书
学校节能减排倡议书
2014/05/16 职场文书
开工仪式策划方案
2014/05/23 职场文书
大学生实习证明范本
2014/09/19 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书