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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
php中替换字符串中的空格为逗号','的方法
Jun 09 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
PHP技术开发微信公众平台
Jul 22 PHP
php中使用websocket详解
Sep 23 PHP
Mac下php 5升级到php 7的步骤详解
Apr 26 PHP
php实现评论回复删除功能
May 23 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
Laravel接收前端ajax传来的数据的实例代码
Jul 20 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 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脚本数据库功能详解(中)
2006/10/09 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
2017/10/10 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
javascript获得网页窗口实际大小的示例代码
2013/09/21 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
2018/11/10 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
JS面向对象编程基础篇(三) 继承操作实例详解
2020/03/03 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
python 数据加密代码
2008/12/24 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python爬虫入门教程--快速理解HTTP协议(一)
2017/05/25 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
pandas-resample按时间聚合实例
2019/12/27 Python
Python判断三段线能否构成三角形的代码
2020/04/12 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
管理部部长岗位职责
2013/12/05 职场文书
大二法学专业职业生涯规划范文
2014/02/12 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书