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 相关文章推荐
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 PHP
PHP语法速查表
Jan 02 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP中error_log()函数的使用方法
Jan 20 PHP
php支持中文字符串分割的函数
May 28 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
PHP重定向与伪静态区别
Feb 19 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
PHP _construct()函数讲解
Feb 03 PHP
微信支付之JSAPI公众号支付详解
May 15 PHP
PHP中strval()函数实例用法
Jun 07 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
require(),include(),require_once()和include_once()区别
2008/03/27 PHP
Discuz!下Memcache缓存实现方法
2010/05/28 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
PHP实现二叉树的深度优先与广度优先遍历方法
2015/09/28 PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
2015/11/10 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
重置Redux的状态数据的方法实现
2019/11/18 Javascript
JS实现碰撞检测效果
2020/03/12 Javascript
[01:08:48]LGD vs OG 2018国际邀请赛淘汰赛BO3 第三场 8.25
2018/08/29 DOTA
python批量修改文件名的实现代码
2014/09/01 Python
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
浅谈Python的文件类型
2016/05/30 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
pymysql模块的操作实例
2019/12/17 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
Python容器类型公共方法总结
2020/08/19 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
几个Linux面试题笔试题
2012/12/01 面试题
保卫钓鱼岛口号
2014/06/20 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
个人工作能力自我评价
2015/03/05 职场文书
同学联谊会邀请函
2019/06/24 职场文书
python如何为list实现find方法
2022/05/30 Python
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js