热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

money_tocash.php,PHP策略模式

本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下例如:一个电商网站系统,针对男性女

本篇文章给大家分享的内容是关于PHP策略模式,有着一定的参考价值,有需要的朋友可以参考一下

例如:一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告

6 项目应用

6.1 需求说明

实现一个商场收银系统,商品可以有正常收费,打折收费,返利收费等模式(来之《大话设计模式》)

6.2 需求分析

按照需求,可以将收费操作设计成为一个接口算法,正常收费,打折收费,返利收费都继承这个接口,实现不同的策略算法。然后设计一个环境类,去维护策略的实例。

6.3 设计架构图

d2d9547dfcb49813d29564e4fcdb5321.png

6.4 程序源码下载

http://download.csdn.net/detail/clevercode/8700009

6.5 程序说明

1)strategy.php

[php] view plain copy

/**

* strategy.php

*

* 策略类:定义了一系列的算法,这些算法都是完成的相同工作,但是实现不同。

*

* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的

* 代码会有改变和优化。

*

* Copyright (c) 2015 http://blog.csdn.net/CleverCode

*

* modification history:

* --------------------

* 2015/5/5, by CleverCode, Create

*

*/

// 定义接口现金策略,每种策略都是具体实现acceptCash,但都是实现收取现金功能

interface ICashStrategy{

// 收取现金

public function acceptCash($money);

}

// 正常收取策略

class NormalStrategy implements ICashStrategy{

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

return $money;

}

}

// 打折策略

class RebateStrategy implements ICashStrategy{

// 打折比例

private $_moneyRebate = 1;

/**

* 构造函数

*

* @param double $rebate 比例

* @return void

*/

public function __construct($rebate){

$this->_moneyRebate = $rebate;

}

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

return $this->_moneyRebate * $money;

}

}

// 返利策略

class ReturnStrategy implements ICashStrategy{

// 返利条件

private $_moneyCondition = null;

// 返利多少

private $_moneyReturn = null;

/**

* 构造函数

*

* @param double $moneyCondition 返利条件

* @return double $moneyReturn 返利多少

* @return void

*/

public function __construct($moneyCondition, $moneyReturn){

$this->_moneyCondition = $moneyCondition;

$this->_moneyReturn = $moneyReturn;

}

/**

* 返回正常金额

*

* @param double $money 金额

* @return double 金额

*/

public function acceptCash($money){

if (!isset($this->_moneyCondition) || !isset($this->_moneyReturn) || $this->_moneyCondition == 0) {

return $money;

}

return $money - floor($money / $this->_moneyCondition) * $this->_moneyReturn;

}

}

2) strategyPattern.php

[php] view plain copy

/**

* strategyPattern.php

*

* 设计模式:策略模式

*

* 模式简介:

* 它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,

* 不会影响到使用算法的客户。

* 策略模式是一种定义一些列算法的方法,从概念上来看,所有这些算法完成的都是

* 相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类

* 与使用算法类的耦合。

* 本源码中的各种结账方式,其实都是在结账,但是具体的实现确实不同的。策略模式与

* 命令模式不同的是,命令模式的算法是相互独立的,每个命令做的工作是不同的。而策略模式

* 却是在做通一种工作。

*

* 特别声明:本源代码是根据《大话设计模式》一书中的C#案例改成成PHP代码,和书中的

* 代码会有改变和优化。

*

* Copyright (c) 2015 http://blog.csdn.net/CleverCode

*

* modification history:

* --------------------

* 2015/5/14, by CleverCode, Create

*

*/

// 加载所有的策略

include_once ('strategy.php');

// 创建一个环境类,根据不同的需求调用不同策略

class CashContext{

// 策略

private $_strategy = null;

/**

* 构造函数

*

* @param string $type 类型

* @return void

*/

public function __construct($type = null){

if (!isset($type)) {

return;

}

$this->setCashStrategy($type);

}

/**

* 设置策略(简单工厂与策略模式混合使用)

*

* @param string $type 类型

* @return void

*/

public function setCashStrategy($type){

$cs = null;

switch ($type) {

// 正常策略

case 'normal' :

$cs = new NormalStrategy();

break;

// 打折策略

case 'rebate8' :

$cs = new RebateStrategy(0.8);

break;

// 返利策略

case 'return300to100' :

$cs = new ReturnStrategy(300, 100);

break;

}

$this->_strategy = $cs;

}

/**

* 获取结果

*

* @param double $money 金额

* @return double

*/

public function getResult($money){

return $this->_strategy->acceptCash($money);

}

/**

* 获取结果

*

* @param string $type 类型

* @param int $num 数量

* @param double $price 单价

* @return double

*/

public function getResultAll($type, $num, $price){

$this->setCashStrategy($type);

return $this->getResult($num * $price);

}

}

/*

* 客户端类

* 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,

* 使业务逻辑的算法更具有可移植性

*/

class Client{

public function main(){

$total = 0;

$cashContext = new CashContext();

// 购买数量

$numA = 10;

// 单价

$priceA = 100;

// 策略模式获取结果

$totalA = $cashContext->getResultAll('normal', $numA, $priceA);

$this->display('A', 'normal', $numA, $priceA, $totalA);

// 购买数量

$numB = 5;

// 单价

$priceB = 100;

// 打折策略获取结果

$totalB = $cashContext->getResultAll('rebate8', $numB, $priceB);

$this->display('B', 'rebate8', $numB, $priceB, $totalB);

// 购买数量

$numC = 10;

// 单价

$priceC = 100;

// 返利策略获取结果

$totalC = $cashContext->getResultAll('return300to100', $numC, $priceC);

$this->display('C', 'return300to100', $numC, $priceC, $totalC);

}

/**

* 打印

*

* @param string $name 商品名

* @param string $type 类型

* @param int $num 数量

* @param double $price 单价

* @return double

*/

public function display($name, $type, $num, $price, $total){

echo date('Y-m-d H:i:s') . ",$name,[$type],num:$num,price:$price,total:$total\r\n";

}

}

/**

* 程序入口

*/

function start(){

$client = new Client();

$client->main();

}

start();

?>

相关推荐:

实例分析PHP策略模式

PHP策略模式定义与用法实例详解



推荐阅读
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • Dijkstra算法是一种高效的图论算法,用于在网络中寻找两点之间的最短路径。该算法通过逐步扩展已知最短路径的节点,最终确定从起点到终点的最优路径。在实际应用中,Dijkstra算法广泛应用于路由选择、交通规划等领域,能够有效解决大规模网络中的路径优化问题。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 题目《UVa 11978 福岛核爆问题》涉及圆与多边形交集面积的计算及二分法的应用。该问题的核心在于通过精确的几何运算与高效的算法实现来解决复杂图形的面积计算。在实现过程中,特别需要注意的是对多边形顶点的平移处理,确保所有顶点包括最后一个顶点 \( p[n] \) 都经过正确的位移,以避免因细节疏忽导致的错误。此外,使用循环次数为50次的二分法能够有效提高算法的精度和稳定性。 ... [详细]
  • 深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略
    深入解析 iOS Objective-C 中的对象内存对齐规则及其优化策略 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • 欢迎来到Netgen新时代:探索网络生成技术的无限可能
    欢迎进入Netgen的新时代:探索网络生成技术的无限潜力。本文将详细介绍如何编译下载的Netgen源代码,生成Netgen程序,并提供开发所需的库nglib。此外,还将探讨Netgen在现代网络设计与仿真中的应用前景,以及其在提高网络性能和可靠性方面的关键作用。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
author-avatar
用户0h2eqqbg44
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有