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将向Java靠拢
Oct 09 PHP
社区(php&amp;&amp;mysql)四
Oct 09 PHP
PHP编程之高级技巧——利用Mysql函数
Oct 09 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
使用Huagepage和PGO来提升PHP7的执行性能
Nov 30 PHP
PHP简单实现合并2个数字键数组值的方法
May 30 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 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
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
构建简单的Webmail系统
2006/10/09 PHP
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
php SQL之where语句生成器
2009/03/24 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
javascript伸缩型菜单实现代码
2015/11/16 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
vue中h5端打开app(判断是安卓还是苹果)
2021/02/26 Vue.js
python实现simhash算法实例
2014/04/25 Python
python实现绘制树枝简单示例
2014/07/24 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python count函数使用方法实例解析
2020/03/23 Python
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
美术国培研修感言
2014/02/12 职场文书
滴水洞导游词
2015/02/10 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
秋菊打官司观后感
2015/06/03 职场文书
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
Golang gRPC HTTP协议转换示例
2022/06/16 Golang