PHP策略模式定义与用法示例


Posted in PHP onJuly 27, 2017

本文实例讲述了PHP策略模式定义与用法。分享给大家供大家参考,具体如下:

概述

策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化

UML图

PHP策略模式定义与用法示例

策略模式中主要角色

这个模式设计到三个角色:

环境角色(Context):持有一个Strategy的引用
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体的策略类所需的接口
具体策略(ConcreateStrategy)角色:包装了相关的算法或行为

使用场景

假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。

根据上述描述,货品价格是根据以下几个算法中的一个进行的:

对普通会员无折扣
对中级会员8折
对高级会员7折

UML图

PHP策略模式定义与用法示例

实现代码:

<?php
/**
 * 策略抽象类
 * @author wzy
 *
 */
interface Strategy
{
  public function calPrice ($price);
}
/**
 * 普通会员策略类
 *
 * @author wzy
 *
 */
class PrimaryStrategy implements Strategy
{
  public function calPrice ($price)
  {
    echo "普通会员无折扣";
    return $price;
  }
}
/**
 * 中级会员策略类
 *
 * @author wzy
 *
 */
class MiddleStrategy implements Strategy
{
  public function calPrice ($price)
  {
    echo "中级会员8折优惠";
    return $price * 0.8;
  }
}
/**
 * 高级会员策略类
 *
 * @author wzy
 *
 */
class HighStrategy implements Strategy
{
  public function calPrice ($price)
  {
    echo "高级会员7折优惠";
    return $price * 0.7;
  }
}
/**
 * Context实现类
 *
 * @author wzy
 *
 */
class Price
{
  /**
   * 具体的策略类对象
   *
   * @var object
   */
  private $strategyInstance;
  /**
   * 构造函数,传入一个具体的策略对象
   *
   * @param object $instance
   */
  public function __construct ($instance)
  {
    $this->strategyInstance = $instance;
  }
  /**
   * 计算货品的价格
   *
   * @param double $price
   */
  public function quote ($price)
  {
    return $this->strategyInstance->calPrice($price);
  }
}
/**
 * 客户端操作
 */
$high = new HighStrategy();
$priceClass = new Price($high);
$price = $priceClass->quote(400);
echo $price;
?>

回顾策略模式

策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的扩展性和维护性

算法的平等性

策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是一样的,这样才能实现算法之间的互相转换

运行时策略的唯一性

运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只有一个

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Session的工作方式
Oct 09 PHP
Discuz 6.0+ 批量注册用户名
Sep 13 PHP
php引用地址改变变量值的问题
Mar 23 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP扩展开发入门教程
Feb 26 PHP
PHP实现扎金花游戏之大小比赛的方法
Mar 10 PHP
php获取指定数量随机字符串的方法
Feb 06 PHP
PHP中Trait及其应用详解
Feb 14 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
laravel框架模型和数据库基础操作实例详解
Jan 25 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 #PHP
php表单文件iframe异步上传实例讲解
Jul 26 #PHP
php实现的统计字数函数定义与使用示例
Jul 26 #PHP
PHP SFTP实现上传下载功能
Jul 26 #PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 #PHP
php判断str字符串是否是xml格式数据的方法示例
Jul 26 #PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 #PHP
You might like
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
cakephp常见知识点汇总
2017/02/24 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
如何实现JS函数的重载
2006/09/22 Javascript
javascript object array方法使用详解
2012/12/03 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
深入理解JavaScript单体内置对象
2016/06/06 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
2017/10/26 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
Angular6新特性之Angular Material
2018/12/28 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
python实现图片上添加图片
2019/11/26 Python
python解释器安装教程的方法步骤
2020/07/02 Python
vscode调试django项目的方法
2020/08/06 Python
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
中药专业自荐信范文
2014/03/18 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
pytorch 运行一段时间后出现GPU OOM的问题
2021/06/02 Python
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技