<?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 商场收银收费系统,使用的策略模式的更多相关文章

  1. 读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)

    要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费.两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始. 核心 ...

  2. [Python设计模式] 第2章 商场收银软件——策略模式

    github地址: https://github.com/cheesezh/python_design_patterns 题目 设计一个控制台程序, 模拟商场收银软件,根据客户购买商品的单价和数量,计 ...

  3. 读《大话设计模式》——应用策略模式的"商场收银系统"(WinForm)

    策略模式的结构 这个模式涉及到三个角色: 环境(Context)角色:持有一个 Strategy 类的引用.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所 ...

  4. 菜鸟学开店—最简收银POS系统

    佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...

  5. javascript 写策略模式,商场收银打折优惠策略

    [Decode error - output not utf-8] ----------------------------- 购物清单 方便面 : 100 x 50 = 5000 | 4000 菊花 ...

  6. C++ 大作业 超市收银系统

    #include<iostream> #include<fstream> #include<string> #include<iomanip> #inc ...

  7. PDA 收银系统PDA手持打印扫描枪 销售开单 收银 扫描打印一体机

    在零售方面也有很好的应用.如在一些高端品牌零售店,营业员可以随身导购,一站式完成了商品销售和收银,很是受消费者追捧,符合了企业对客户体验以及行业领先的追求. PDA收银系统是一款多功能可以取代专业收银 ...

  8. 浩瀚移动POS收银开单扫描解决方案PDA仓储系统,无线批发,移动批发,无线POS,无线销售APP-车销管理PDA

    适用范围 各种业态的批发商铺.批发市场.订货会.展销会.配送中心仓库…… 产品简介 随着移动技术与智能PDA设备的迅猛发展,中国已经跨步进入移动信息化社会.移动商务是移动信息社会的重要载体与形式,它开 ...

  9. Atitit.收银系统pos 以及打印功能的行业标准

    Atitit.收银系统pos 以及打印功能的行业标准 1. ESC指令序列 Escape指令序列不同于ESC/POS指令 1 2. 打印标准OPOS POSPrinter 与 CashDrawer 驱 ...

随机推荐

  1. 修改button样式小例子

    .toolbar button{ background: none; border:none; padding:0 3px;} <div class="toolbar toolbar- ...

  2. 三星固态硬盘ssd产品线收集

    目录 三星ssd按时间展示: 三星ssd后缀带a与不带a的区别,举其中一例: 下面是从三星中国的官网截图的产品线: 产品线列表: 总结: 参考: 最近在淘宝看到了很多拆机ssd,三星作为世界上唯一一家 ...

  3. python 安装wheel .whl文件

    首先得有pip没有的话安装一个. 然后:pip install wheel 然后:pip install 路径\文件名.whl ===================== pip --versionp ...

  4. 题解——loj6279 数列分块入门3 (分块)

    用set维护有序序列 或许sort也可以,但这题的前驱定义是严格小于 所以要去重 然后就是记得自己打的加法tag在query的时候一定要算上 话说这题数据有点fake啊忘了查询算上自己的标记了还有70 ...

  5. 利用Python 脚本生成 .h5 文件 代码

    利用Python 脚本生成 .h5 文件 import os, json, argparse from threading import Thread from Queue import Queue ...

  6. ISE14.7兼容性问题集锦https://www.cnblogs.com/ninghechuan/p/7241371.html

    ISE14.7兼容性问题集锦 对于电子工程师来说,很多电路设计仿真软件都是特别大的,安装下来一般都是上G,甚至几十G,而且win7的兼容性也是最好的,不愿意升级win10是因为麻烦,而且没有必要,对于 ...

  7. HDU 4323 Magic Number(编辑距离DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=4323 题意: 给出n个串和m次询问,每个询问给出一个串和改变次数上限,在不超过这个上限的情况下,n个串中有多少个 ...

  8. 前端面试题 | JS部分(附带答案)

    目前在找工作,所以各方收集了一堆面试题.其实刷面试题的过程也能更新自己对知识的认识,所以也提醒自己多看多理解.如果对下面题目有更深理解,会实时更新.遇到新题目,也会不定时更新.希望能帮助到部分朋友- ...

  9. 前端性能优化之按需加载(React-router+webpack)

    一.什么是按需加载 和异步加载script的目的一样(异步加载script的方法),按需加载/代码切割也可以解决首屏加载的速度. 什么时候需要按需加载 如果是大文件,使用按需加载就十分合适.比如一个近 ...

  10. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) D. Office Keys time limit per test2 seconds 二分

    D. Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...