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 相关文章推荐
ADODB的数据库封包程序库
Dec 31 PHP
推荐php模板技术[转]
Jan 04 PHP
如何隐藏你的.php文件
Jan 04 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
优化WordPress的Google字体以加速国内服务器上的运行
Nov 24 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP Header用于页面跳转时的几个注意事项
Oct 21 PHP
PHP读取、解析eml文件及生成网页的方法示例
Sep 04 PHP
php实现的AES加密类定义与用法示例
Jan 29 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
PHP压缩图片功能的介绍
Mar 21 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
php通过字符串调用函数示例
2014/03/02 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
php计算整个目录大小的方法
2015/06/01 PHP
php检查页面是否被百度收录
2015/10/28 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
2019/03/27 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
对Python 语音识别框架详解
2018/12/24 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
骨干教师培训感言
2014/01/16 职场文书
法律进机关实施方案
2014/03/12 职场文书
表彰大会主持词
2014/03/26 职场文书
建议书的格式
2014/05/12 职场文书
食堂卫生管理制度
2015/08/04 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
Python 可迭代对象 iterable的具体使用
2021/08/07 Python
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电