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 相关文章推荐
Session的工作方式
Oct 09 PHP
php导入导出excel实例
Oct 25 PHP
PHP中获取时间的下一周下个月的方法
Mar 18 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
PHP中JSON的应用技巧
Oct 10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
如何离线执行php任务
Feb 21 PHP
PHP获取二叉树镜像的方法
Jan 17 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
2012/09/07 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
js获取html文件的思路及示例
2013/09/17 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
jQuery插件开发精品教程让你的jQuery提升一个台阶
2016/01/27 Javascript
Bootstrap基本样式学习笔记之图片(6)
2016/12/07 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
浅谈vue项目打包优化策略
2018/09/29 Javascript
原生JS实现逼真的图片3D旋转效果详解
2019/02/16 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
详解vue 组件
2020/06/11 Javascript
[01:07:47]Secret vs Optic Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
python发腾讯微博代码分享
2014/01/10 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
2014/11/04 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Django中的Signal代码详解
2018/02/05 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
python启动应用程序和终止应用程序的方法
2019/06/28 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
金士达面试非笔试
2012/03/14 面试题
公证委托书格式
2014/09/13 职场文书
工作能力自我评价2015
2015/03/05 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python