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学习笔记之数组篇
Jun 28 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
Jul 15 PHP
Yii配置文件用法详解
Dec 04 PHP
教你识别简单的免查杀PHP后门
Sep 13 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
Mar 21 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
Jan 04 PHP
Yii框架安装简明教程
May 15 PHP
PHP dirname简单使用代码实例
Nov 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
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
两种方法实现文本框输入内容提示消失
2013/03/17 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
无刷新上传文件并返回自定义值
2015/06/11 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
js实现日历的简单算法
2017/01/24 Javascript
浅谈js闭包理解
2019/03/28 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
python实现SOM算法
2018/02/23 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
python利用Excel读取和存储测试数据完成接口自动化教程
2020/04/30 Python
python 负数取模运算实例
2020/06/03 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
用canvas画心电图的示例代码
2018/09/10 HTML / CSS
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
音乐专业应届生教师求职信
2013/11/04 职场文书
2014年父亲节活动方案
2014/03/06 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
离职感谢信
2015/01/21 职场文书
毕业生捐书活动倡议书
2015/04/27 职场文书
乔布斯辞职信(中英文对照)
2015/05/12 职场文书
2015年语文教师工作总结
2015/05/25 职场文书