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 mysql索引问题
Jun 07 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
支持生僻字且自动识别utf-8编码的php汉字转拼音类
Jun 27 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
PHP控制前台弹出对话框的实现方法
Aug 21 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
php数组遍历类与用法示例
May 24 PHP
PHP数组基本用法与知识点总结
Jun 02 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批量删除超链接的实现方法
2015/10/19 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
JS替换字符串中字符即替换全部而不是第一个
2014/06/04 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
js实现创建删除html元素小结
2015/09/30 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
2015/11/24 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
[52:52]完美世界DOTA2联赛PWL S3 LBZS vs access 第一场 12.10
2020/12/13 DOTA
对python函数签名的方法详解
2019/01/22 Python
Python读写文件基础知识点
2019/06/10 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
2019/08/22 Python
Python如何计算语句执行时间
2019/11/22 Python
python的range和linspace使用详解
2019/11/27 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
python怎么删除缓存文件
2020/07/19 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
《生命的药方》教学反思
2014/04/08 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
硕士学位论文评语
2014/12/31 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
民间借贷被告代理词
2015/05/23 职场文书
鲁滨逊漂流记读书笔记
2015/06/26 职场文书
工程主管竞聘书
2015/09/15 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记
Go语言特点及基本数据类型使用详解
2022/03/21 Golang