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与javascript的两种交互方式
Oct 09 PHP
第十四节--命名空间
Nov 16 PHP
php中变量及部分适用方法
Mar 27 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
PHP读取PDF内容配合Xpdf的使用
Nov 24 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
使用GDB调试PHP代码,解决PHP代码死循环问题
Mar 02 PHP
PHP5.3以上版本安装ZendOptimizer扩展
Mar 27 PHP
PHP curl使用实例
Jul 02 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
详细对比php中类继承和接口继承
Oct 11 PHP
掌握PHP垃圾回收机制详解
Mar 13 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
批量修改RAR文件注释的php代码
2010/11/20 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
javascript动画效果类封装代码
2007/08/28 Javascript
JQuery 技巧和窍门整理(8个)
2010/04/22 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
python编码最佳实践之总结
2016/02/14 Python
python用户管理系统的实例讲解
2017/12/23 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
平面设计求职信
2014/03/10 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
个人务虚会发言材料
2014/10/20 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
行政主管岗位职责
2015/02/03 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
应急管理工作总结2015
2015/05/04 职场文书
让子弹飞观后感
2015/06/11 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
CSS3实现的水平标题菜单
2021/04/14 HTML / CSS
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL