php 商场收银收费系统,使用的策略模式
<?php
//策略模式就是你有很多的方法,选择一种适合自己的,
// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,
// 工厂模式就是 //策略模式 优惠系统、工资计算系统
//工厂模式 主要应用在多数据库选择,类库文件加载等 //商场收银系统有正常收费,打折收费,返利收费模式
interface cashStrategy{
public function acceptCash($money);
}
//正常收费
class NormalStrategy implements cashStrategy{
public function acceptCash($money){
return $money;
}
}
//打折收费
class RebateStrategy implements cashStrategy{
//打折比例
private $moneyRebate = 1;
public function __construct($rebate){
$this->moneyRebate = $rebate;
}
public function acceptCash($money){
return $this->moneyRebate*$money;
}
}
//返利收费
class ReturnStrategy implements cashStrategy{
//返利条件
private $moneyCondition = null;
//返利多少
private $moneyReturn = null;
public function __construct($moneyCondition ,$moneyReturn){
$this->moneyCondition = $moneyCondition;
$this->moneyReturn = $moneyReturn;
}
public function acceptCash($money){
if(!isset($this->moneyCondition) || !isset($this->moneyReturn) || $this->moneyCondition == 0)
return $money;
return $money - floor($money/$this->moneyCondition)*$this->moneyReturn;
}
} // 加载所有的策略 // 创建一个环境类,根据不同的需求调用不同策略
class Factory{
private $_strategy = null;
public function __construct($type = null){
if(!isset($type))
return;
$this->setCashStrategy($type); }
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;
}
//获取结果
public function getResult($money){
return $this->_strategy->acceptCash($money);
}
public function getResultAll($type, $num, $price){
$this->setCashStrategy($type);
return $this->getResult($num * $price);
} } /*
* 客户端类
* 让客户端和业务逻辑尽可能的分离,降低客户端和业务逻辑算法的耦合,
* 使业务逻辑的算法更具有可移植性
*/
class Client{ public function main(){
$total = 0; $factory = new Factory(); // 购买数量
$numA = 10;
// 单价
$priceA = 100;
// 策略模式获取结果
$totalA = $factory->getResultAll('normal', $numA, $priceA);
$this->display('A', 'normal', $numA, $priceA, $totalA); // 购买数量
$numB = 5;
// 单价
$priceB = 100;
// 打折策略获取结果
$totalB = $factory->getResultAll('rebate8', $numB, $priceB);
$this->display('B', 'rebate8', $numB, $priceB, $totalB); // 购买数量
$numC = 10;
// 单价
$priceC = 100;
// 返利策略获取结果
$totalC = $factory->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<br>";
}
} /**
* 程序入口
*/
function start(){
$client = new Client();
$client->main();
} start(); ?> 打印结果:
2018-10-09 11:17:30,A,[normal],num:10,price:100,total:1000
2018-10-09 11:17:30,B,[rebate8],num:5,price:100,total:400
2018-10-09 11:17:30,C,[return300to100],num:10,price:100,total:700
php 商场收银收费系统,使用的策略模式的更多相关文章
- 读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)
要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费.两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始. 核心 ...
- [Python设计模式] 第2章 商场收银软件——策略模式
github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...
- 读《大话设计模式》——应用策略模式的"商场收银系统"(WinForm)
策略模式的结构 这个模式涉及到三个角色: 环境(Context)角色:持有一个 Strategy 类的引用.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所 ...
- 菜鸟学开店—最简收银POS系统
佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...
- javascript 写策略模式,商场收银打折优惠策略
[Decode error - output not utf-8] ----------------------------- 购物清单 方便面 : 100 x 50 = 5000 | 4000 菊花 ...
- C++ 大作业 超市收银系统
#include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...
- PDA 收银系统PDA手持打印扫描枪 销售开单 收银 扫描打印一体机
在零售方面也有很好的应用.如在一些高端品牌零售店,营业员可以随身导购,一站式完成了商品销售和收银,很是受消费者追捧,符合了企业对客户体验以及行业领先的追求. PDA收银系统是一款多功能可以取代专业收银 ...
- 浩瀚移动POS收银开单扫描解决方案PDA仓储系统,无线批发,移动批发,无线POS,无线销售APP-车销管理PDA
适用范围 各种业态的批发商铺.批发市场.订货会.展销会.配送中心仓库…… 产品简介 随着移动技术与智能PDA设备的迅猛发展,中国已经跨步进入移动信息化社会.移动商务是移动信息社会的重要载体与形式,它开 ...
- Atitit.收银系统pos 以及打印功能的行业标准
Atitit.收银系统pos 以及打印功能的行业标准 1. ESC指令序列 Escape指令序列不同于ESC/POS指令 1 2. 打印标准OPOS POSPrinter 与 CashDrawer 驱 ...
随机推荐
- bzoj2086: [Poi2010]Blocks DP,单调栈
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2086 思路 这就有点妙了 题目意思就是让你求平均数>=k的最长序列 先求出a[i] ...
- RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个
问题现象 RocketMQ3.2.2版本,测试时尝试发送消息时自动创建Topic,设置了队列数量为8: producer.setDefaultTopicQueueNums(8); 同时设置broker ...
- Excel lastindex of a substring
I think I get what you mean. Let's say for example you want the right-most \ in the following string ...
- 将一个符合URL格式的字符串变成链接
function replaceURLWithHTMLLinks(text) { /* Example: >>> GateOne.Utils.replaceURLWithHTMLLi ...
- Java 数据库篇
一.简易封装JDBC工具类: package com.jackie.MyBatis.main; import java.sql.Connection; import java.sql.DriverMa ...
- 什么是java OOM?如何分析及解决oom问题?
最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要 ...
- H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例
H5手机移动端调起浏览器(qq浏览器,uc浏览器)自带分享功能实例 (转载:https://blog.csdn.net/weixin_38787928/article/details/86741227 ...
- VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业、教育、游戏)
VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业.教育.游戏) 可公对公签正规合同,开发票. 我们是北京的公司.专业团队,成员为专业 VR/AR 产品公司一线开发人员,有大型产品开发 ...
- 实现一个键对应多个值的字典(multidict)
一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面.比如,你可以像下面这样构造这样的字典: d = { , , ], , ...
- NativeWindow_02_DialogBoxParam_VC6
PS: 代码参考于<<Windows环境下32位汇编语言程序设计.chm>>,第5章,"5.4 对 话 框(2)" . ZC: 与CreateWindow( ...