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的面向对象编程
Oct 09 PHP
让你的网站首页自动选择语言转跳
Dec 06 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
Yii学习总结之安装配置
Feb 22 PHP
php返回相对时间(如:20分钟前,3天前)的方法
Apr 14 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
PHP制作用户注册系统
Oct 23 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
Yii2框架类自动加载机制实例分析
May 02 PHP
PHP下载文件函数与用法示例
Sep 27 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
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
第四节--构造函数和析构函数
2006/11/16 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php微信公众号开发之二级菜单
2018/10/20 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
JS是否可以跨文件同时控制多个iframe页面的应用技巧
2007/12/16 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
2015/04/12 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vuejs使用递归组件实现树形目录的方法
2017/09/30 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python实现图片筛选程序
2018/10/24 Python
python3调用windows dos命令的例子
2019/08/14 Python
django在开发中取消外键约束的实现
2020/05/20 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
应聘护士自荐信
2013/10/21 职场文书
临床医学系毕业生推荐信
2013/11/09 职场文书
项目考察欢迎辞
2014/01/17 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
环保证明
2015/06/23 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
安全伴我行主题班会
2015/08/13 职场文书