PHP策略模式定义与用法示例
本文实例讲述了PHP策略模式定义与用法。分享给大家供大家参考,具体如下:
概述
策略模式属于对象的行为模式。其用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化
UML图
策略模式中主要角色
这个模式设计到三个角色:
环境角色(Context):持有一个Strategy的引用
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体的策略类所需的接口
具体策略(ConcreateStrategy)角色:包装了相关的算法或行为
使用场景
假设现在要设计一个购物车系统,一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这个复杂。例如:对普通会员无折扣,对中级会员提供8折优惠,对高级会员提供7折优惠。
根据上述描述,货品价格是根据以下几个算法中的一个进行的:
对普通会员无折扣
对中级会员8折
对高级会员7折
UML图
实现代码:
<?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; ?>
回顾策略模式
策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的扩展性和维护性
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是一样的,这样才能实现算法之间的互相转换
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只有一个
(资源库 www.zyku.net)
您可能感兴趣的文章
- 07-27阿里云删除快照策略以及快照禁止自动计费
- 12-25Windows Server 2008 R2常规安全设置及基本安全策略
- 12-28Pr视屏剪辑-Pr视屏剪辑应用软件功能介
- 11-23苹果音响homepod怎么重新绑定wifi
- 09-23vivox70如何设置微信视频美颜
- 03-18phpStudy设置允许远程访问MySQL数据库
- 02-15DedeCMS织梦模板标签调用大全
- 07-03PHP使用explode需要注意的问题(空字符
- 09-14Tableau是什么?Tableau介绍
- 11-02airpods pro重新配对教程介绍
- 08-15opporeno6pro+应用锁功能在哪里
- 02-17正则匹配密码只能是数字和字母组合字
- 02-28帝国CMS实现自定义当前位置导航[
- 03-16php生成无限栏目树
- 10-13realmegtneo2怎么唤醒语音助手
- 12-05荣耀x20如何设置电量百分比
- 11-19小天才电话手表挂失步骤介绍
- 09-17法语背单词学习计划设置教程分享
- 07-15帝国CMS防灌水机群发的一些功能说明
- 03-10网站301跳转(重定向)正确操作方法

最近更新
阅读排行
猜你喜欢
- 09-22荣耀50se开启与关闭返回键教程分享
- 09-19小米平板5pro连接蓝牙鼠标教程分享
- 06-02QQ访问网站提示当前网页非官方页面,请
- 12-22vivoY76s开启双击解锁方法分享
- 10-11小米手表color2睡眠模式如何开启
- 12-28樱花视频编辑-樱花视频编辑应用软件功
- 10-26jquery手机页面顶部下拉滑动搜索框代
- 09-19iqoo8pro地震预警启用步骤一览
- 06-18帝国CMS7.5版多访问端升级:支持在主端
- 12-26vivo手机怎么设置来电跑马灯效果