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如何透过ODBC来存取数据库
Oct 09 PHP
PHP类的使用 实例代码讲解
Dec 28 PHP
PHP常用编译参数中文说明
Sep 27 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
FastCGI 进程意外退出造成500错误
Jul 26 PHP
PHP微信开发之有道翻译
Jun 23 PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 PHP
PHP如何读取由JavaScript设置的Cookie
Mar 22 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
php实现统计二进制中1的个数算法示例
Jan 23 PHP
php+Ajax处理xml与json格式数据的方法示例
Mar 04 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
php中注册器模式类用法实例分析
2015/11/03 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
精通Javascript系列之Javascript基础篇
2011/06/07 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
python中实现控制小数点位数的方法
2019/01/24 Python
解决pip install psycopg2出错问题
2020/07/09 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
世界首屈一指的在线男士内衣权威:HisRoom
2017/08/05 全球购物
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
思想汇报范文
2013/11/04 职场文书
气象学专业个人求职信
2014/03/15 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
生物科学专业自荐书
2014/06/20 职场文书
国庆宣传标语
2014/06/30 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
Linux下搭建SFTP服务器的命令详解
2022/06/25 Servers
基于Python编写一个监控CPU的应用系统
2022/06/25 Python