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 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
Discuz板块横排显示图片的实现方法
May 28 PHP
PHP Error与Logging函数的深入理解
Jun 03 PHP
ThinkPHP3.1新特性之命名范围的使用
Jun 19 PHP
javascript some()函数用法详解
Nov 13 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
PHPCMS忘记后台密码的解决办法
Oct 30 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP双向链表定义与用法示例
Jan 31 PHP
在Laravel的Model层做数据缓存的实现
Sep 26 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 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获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP实现搜索相似图片
2015/09/22 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
详解yii2使用多个数据库的案例
2017/06/16 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
一个原生的用户等级的进度条
2010/07/03 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
基于jQuery的公告无限循环滚动实现代码
2012/05/11 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
js实现简单排列组合的方法
2016/01/27 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
Django的分页器实例(paginator)
2017/12/01 Python
Python3.5迭代器与生成器用法实例分析
2019/04/30 Python
python如何处理程序无法打开
2020/06/16 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
军训自我鉴定怎么写
2014/02/13 职场文书
司机职责范本
2014/03/08 职场文书
《开国大典》教学反思
2014/04/19 职场文书
2014幼儿园中班工作总结
2014/11/10 职场文书
2014年度思想工作总结
2014/11/27 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
python实现简单反弹球游戏
2021/04/12 Python
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python