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 动态多文件上传
Jan 18 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
提高define性能的php扩展hidef的安装和使用
Jun 14 PHP
php array的学习笔记
May 10 PHP
PHP反射机制用法实例
Aug 28 PHP
支付宝接口开发集成支付环境小结
Mar 17 PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 PHP
PHP使用xpath解析XML的方法详解
May 20 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 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学习之 循环结构实现代码
2011/06/09 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
JavaScript 注册事件代码
2011/01/27 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
JQuery实现鼠标滑过显示导航下拉列表
2013/09/12 Javascript
javascript常用方法汇总
2014/12/02 Javascript
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
简单实现js鼠标跟随效果
2020/08/02 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
Python学习笔记之常用函数及说明
2014/05/23 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python实现桌面壁纸切换功能
2019/01/21 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
python动态文本进度条的实例代码
2020/01/22 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
uniapp+Html5端实现PC端适配
2020/07/15 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
商务日语毕业生自荐信
2013/11/23 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
秋天的图画教学反思
2014/05/01 职场文书
物业公司的岗位任命书
2014/06/06 职场文书
刑事起诉书范文
2015/05/19 职场文书
2016年过年放假安排通知
2015/08/18 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python
一级电子管军用接收机测评
2022/04/05 无线电
Go gorilla/sessions库安装使用
2022/08/14 Golang