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 相关文章推荐
第十三节--对象串行化
Nov 16 PHP
PHP session有效期问题
Apr 26 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
php下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
php中防止SQL注入的最佳解决方法
Apr 25 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
Sep 22 PHP
教你php如何实现验证码
Jan 20 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上传文件的增强函数
2010/07/21 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
python 2.7.14安装图文教程
2018/04/08 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
python连接打印机实现打印文档、图片、pdf文件等功能
2020/02/07 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
python获取时间戳的实现示例(10位和13位)
2020/09/23 Python
德国网上花店:Valentins
2018/08/15 全球购物
先进员工获奖感言
2014/08/14 职场文书
终止劳动合同证明书样本
2014/11/19 职场文书
商场营业员岗位职责
2015/04/14 职场文书
2015年教师教学工作总结
2015/04/28 职场文书
销售会议开幕词
2016/03/04 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers