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 相关文章推荐
header()函数使用说明
Nov 23 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
微信公众号判断用户是否已关注php代码解析
Jun 24 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
YII框架模块化处理操作示例
Apr 26 PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 24 PHP
Yii框架模拟组件调用注入示例
Nov 11 PHP
php传值和传引用的区别点总结
Nov 19 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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垃圾代码优化操作代码
2010/08/05 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
asp批量修改记录的代码
2008/06/25 Javascript
js中关于new Object时传参的一些细节分析
2011/03/13 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
php实例分享之实现显示网站运行时间
2014/05/20 Javascript
javascript基本包装类型介绍
2015/04/10 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
js如何获取图片url的Blob值并预览示例代码
2019/03/07 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
vue实现广告栏上下滚动效果
2020/11/26 Vue.js
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python实现的爬虫功能代码
2017/06/24 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
Python实现Selenium自动化Page模式
2019/07/14 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
《青山处处埋忠骨》教学反思
2014/04/22 职场文书
新闻编辑求职信
2014/07/13 职场文书
2014班子“三严三实”对照检查材料思想汇报
2014/09/18 职场文书
计算机实训报告范文
2014/11/05 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL