这篇文章主要介绍了PHP策略模式定义与用法,结合实例形式简单分析了php策略模式的原理、实现与使用方法,需要的朋友可以参考下

具体如下:

概述

策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化

UML图

策略模式中主要角色

这个模式设计到三个角色:

环境角色(Context):持有一个Strategy的引用

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体的策略类所需的接口

具体策略(ConcreateStrategy)角色:包装了相关的算法或行为

使用场景

假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。

根据上述描述,货品价格是根据以下几个算法中的一个进行的:

对普通会员无折扣

对中级会员8折

对高级会员7折

UML图

实现代码:

/**

* 策略抽象类

* @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策略模式定义与用法(详解)相关推荐

  1. php templete什么意思,PHP设计模式之模板方法模式定义与用法详解

    本文实例讲述了PHP设计模式之模板方法模式定义与用法.分享给大家供大家参考,具体如下: 什么是模板方法模式 模板方法(Template Method)设计模式中使用了一个类方法templateMeth ...

  2. PHP设计模式之状态模式定义与用法详解

    本文实例讲述了PHP设计模式之状态模式定义与用法.分享给大家供大家参考,具体如下: 什么是状态设计模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当 ...

  3. android object数组赋值_Java对象数组定义与用法详解

    本文实例讲述了Java对象数组定义与用法.分享给大家供大家参考,具体如下: 所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据 ...

  4. html定义var,html的var标签是什么?关于var标签的定义和用法详解

    本篇为大家介绍了html中的var标签,html var标签是什么意思?html var标签有什么用你都知道吗,可能有很多人都不知道,那么就来看看本篇文章吧,除了基础的html var标签的定义和格式 ...

  5. java 对象数组定义_Java对象数组定义与用法详解

    本文实例讲述了Java对象数组定义与用法.分享给大家供大家参考,具体如下: 所谓的对象数组,就是指包含了一组相关的对象,但是在对象数组的使用中一定要清楚一点:数组一定要先开辟空间,但是因为其是引用数据 ...

  6. python定义栈_Python开发中栈的定义及用法详解

    前言 在Python开发中栈的设计和使用是常用到的,可以说是学习Python必须要掌握的一个技能,那么作为程序猿的你掌握了多少呢?掌握不熟练?没关系,跟着小编再来学习一下吧. 正文 栈是常用的数据结构 ...

  7. python close用法_python close()是什么?python close()定义及用法详解

    今天这篇文章我们来了解一下python之中的close,在进入文章之前我们首先要知道Pythonclose是什么,close是什么意思,它能用在python编程之中的什么地方,能够起到什么作用.这些东 ...

  8. python的编程模式-Python设计模式之状态模式原理与用法详解

    本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...

  9. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    Spring MVC 学习总结(二)--控制器定义与@RequestMapping详解 目录 一.控制器定义 1.1.实现接口Controller定义控制器 1.2.使用注解@Controller定义 ...

  10. 站长在线Python精讲:在Python中函数的定义与创建详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中函数的定义与创建详解>.本文的主要内容有:函数的定义.函数的定义规则.函数的创建. 目录 1.函数的定义 2 ...

最新文章

  1. MapReduce 中 UDF、UDAF、UDTF
  2. celery中间件:broker
  3. 独家 | 王海峰:百度大数据与人工智能(附PPT下载)
  4. 最好用的嵌入式网络C库、Lua库
  5. Zend Studio使用教程:使用PHPUnit检测代码(四)
  6. python2.7显示中文_Python 2.7中文显示与处理方法
  7. java数组深拷贝和浅拷贝_java中的深拷贝与浅拷贝(值类型 vs 引用类型)
  8. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc
  9. 统计学三大分布(卡方、t、F)即相应概率密度图的R语言实现
  10. 在集合点的同步 CyclicBarrier
  11. sklearn 下的 SVM 及其参数
  12. 蓝桥杯2015年第六届C/C++省赛B组第一题-奖券数目
  13. (二)zookeeper安装
  14. pytorch实现textCNN
  15. 利用倾斜摄影技术土方工程计算
  16. 制作京东快递查询 css制作三角形
  17. 关于ios 卡顿检测分析
  18. 不等式大两边小中间_不等式取值范围口诀
  19. 【计算机毕业设计】java ssm网上宠物商店系统
  20. Qt界面中如何嵌入网页?

热门文章

  1. SpringBoot之第一个Restfu示例
  2. svn服务器记录日志文件,svn服务器日志时间设置
  3. python django项目实例_【Django】项目实例
  4. python 查看文件名_python 查看文件名和文件路径
  5. 设置背景色为渐变色 css
  6. 笨办法学python 3 48题_附录练习 8-10 笨办法学Python3
  7. Tcl Tutorial 笔记7 ·for incr
  8. winapi编程获取文件版本信息的代码_.Net调用WinAPI轻松实现POS小票并口打印
  9. c++ main函数调用 类中的枚举_为什么 Java 的 main 方法必须是 public static void?
  10. Java中List for循环的几种写法种写法总结(推荐)