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 25 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
Jan 31 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
Jul 15 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
PHP的mysqli_ssl_set()函数讲解
Jan 23 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
php字符串函数 str类常见用法示例
May 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
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
弹出模态框modal的实现方法及实例
2017/09/19 PHP
Jquery 获取表单text,areatext,radio,checkbox,select值的代码
2009/11/12 Javascript
分享10篇优秀的jQuery幻灯片制作教程及应用案例
2011/04/16 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
利用纯Vue.js构建Bootstrap组件
2016/11/03 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
jquery操作ul的一些操作笔记整理(干货)
2017/08/31 jQuery
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
微信小程序实现类似微信点击语音播放效果
2020/03/30 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python写入数据到MP3文件中的方法
2015/07/10 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
Python 列表反转显示的四种方法
2020/11/16 Python
Python GUI库Tkiner使用方法代码示例
2020/11/27 Python
Python爬虫开发与项目实战
2020/12/16 Python
浅谈amaze-ui中datepicker和datetimepicker注意的几点
2020/08/21 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
大学生村官任职感言
2014/01/09 职场文书
鲜花方阵解说词
2014/02/13 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
离婚被告答辩状
2015/05/22 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
HTML基础详解(上)
2021/10/16 HTML / CSS
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏