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 相关文章推荐
修改了一个很不错的php验证码(支持中文)
Feb 14 PHP
PHP高级OOP技术演示
Aug 27 PHP
php面向对象全攻略 (十二) 抽象方法和抽象类
Sep 30 PHP
PHP 配置open_basedir 让各虚拟站点独立运行
Nov 12 PHP
php将session放入memcached的设置方法
Feb 14 PHP
php判断并删除空目录及空子目录的方法
Feb 11 PHP
php实现删除空目录的方法
Mar 16 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
CI框架数据库查询之join用法分析
May 18 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
Jul 01 PHP
详解php用static方法的原因
Sep 12 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 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
极典R601SW收音机
2021/03/02 无线电
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
取得传值的函数
2006/10/27 Javascript
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
使用firebug进行调试javascript的示例
2013/12/16 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
jQuery如何封装输入框插件
2016/08/19 Javascript
移动端界面的适配
2017/01/11 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
js实现首屏延迟加载实现方法 js实现多屏单张图片延迟加载效果
2017/07/17 Javascript
Angular4 组件通讯方法大全(推荐)
2018/07/12 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
python通过smpt发送邮件的方法
2015/04/30 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python django 实现验证码的功能实例代码
2017/05/18 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
python excel多行合并的方法
2020/12/09 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
2016年党员公开承诺书格式范文
2016/03/24 职场文书
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL