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 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
PHP 已经成熟
Dec 04 PHP
php5 apache 2.2 webservice 创建与配置(java)
Jan 27 PHP
解析MySql与Java的时间类型
Jun 22 PHP
二进制交叉权限微型php类分享
Feb 07 PHP
PHP判断一个gif图片是否为动态图片的方法
Nov 19 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
Yii2配置Nginx伪静态的方法
May 05 PHP
PHP数字金额转换成中文大写显示
Jan 05 PHP
PHP实现唤起微信支付功能
Feb 18 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 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 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
javascript英文日期(有时间)选择器
2007/05/02 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
JS实现点击复选框将按钮或文本框变为灰色不可用的方法
2015/08/11 Javascript
JavaScript 栈的详解及实例代码
2017/01/22 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
2018/03/13 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
axios向后台传递数组作为参数的方法
2018/08/11 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
Python 操作 PostgreSQL 数据库示例【连接、增删改查等】
2020/04/21 Python
详解KMP算法以及python如何实现
2020/09/18 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
计算机应用专业自荐信
2014/07/05 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
新教师教学工作总结
2015/08/14 职场文书
聘任书范文大全
2015/09/21 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS