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 相关文章推荐
图形数字验证代码
Oct 09 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php中一个有意思的日期逻辑处理
Mar 25 PHP
PHP更新购物车数量(表单部分/PHP处理部分)
May 03 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php实现粘贴截图并完成上传功能
May 17 PHP
PHP中static关键字以及与self关键字的区别
Jul 01 PHP
php遍历解析xml字符串的方法
May 05 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
Oct 14 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 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(7) php 字符串相关应用
2010/03/05 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
PHP获取input输入框中的值去数据库比较显示出来
2016/11/16 PHP
javascript 尚未实现错误解决办法
2008/11/27 Javascript
DOM基础教程之事件对象
2015/01/20 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
微信小程序 登陆流程详细介绍
2017/01/17 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
使用Vant完成Dialog弹框案例
2020/11/11 Javascript
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
对python文件读写的缓冲行为详解
2019/02/13 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python matplotlib可视化实例解析
2020/06/01 Python
Python filter过滤器原理及实例应用
2020/08/18 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
css3过渡_动力节点Java学院整理
2017/07/11 HTML / CSS
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
Europcar英国:英国汽车和货车租赁
2017/01/21 全球购物
领导视察欢迎词
2014/01/15 职场文书
高中生评语大全
2014/04/25 职场文书
如何写早恋检讨书
2014/09/10 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书