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中看实例学正则表达式
Dec 25 PHP
php扩展ZF――Validate扩展
Jan 10 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
CURL状态码列表(详细)
Jun 27 PHP
PHP入门之常量简介和系统常量
May 12 PHP
Symfony学习十分钟入门经典教程
Feb 03 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
Jun 13 PHP
laravel5使用freetds连接sql server的方法
Dec 07 PHP
apache集成php7.3.5的详细步骤
Jun 20 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 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多线程异步请求的3种方法
2014/01/17 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
js获取当前select 元素值的代码
2010/04/19 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
JavaScript多态与封装实例分析
2018/07/27 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
[01:35:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第一场 1月18日
2021/03/11 DOTA
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
Django添加sitemap的方法示例
2018/08/06 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
2020/06/01 Python
基于nexus3配置Python仓库过程详解
2020/06/15 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Feelunique中文官网:欧洲最大化妆品零售电商
2020/07/10 全球购物
幼儿园教师节活动方案
2014/02/02 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
三年级学生评语大全
2014/12/26 职场文书
后进生评语大全
2015/01/04 职场文书