读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)
要做的是一个商场收银软件,营业员根据客户购买商品单价和数量,向客户收费。两个文本框,输入单价和数量,再用个列表框来记录商品的合计,最终用一个按钮来算出总额就可以了,还需要一个重置按钮来重新开始。
核心代码(v1.0)
- //声明一个double变量total来计算总计
- double total = 0.0d;
- private void btnConfirm_Click(object sender, EventArgs e)
- {
- //声明一个double变量totalPrices来计算每个商品的单价(txtPrice) * 数量(txtNum)后的合计
- double totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text);
- //将每个商品合计计入总计
- total = total + totalPrices;
- //在列表框中显示信息
- lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtNum.Text + " 合计:" + totalPrices.ToString());
- //在lblTotalShow标签上显示总计数
- lblTotalShow.Text = total.ToString();
- }
需求又来了,现在要求商场对商品搞活动,所有的商品打 8 折。扩展功能加了一个下拉选择框……v1.1版本来了
核心代码(v1.1)
- namespace ExtendDiscount
- {
- public partial class frmMain :Skin_Metro
- {
- public frmMain()
- {
- InitializeComponent();
- }
- //声明一个double变量total来计算总计
- double total = 0.0d;
- private void btnConfirm_Click(object sender, EventArgs e)
- {
- //声明一个double变量totalPrices
- double totalPrices = 0d;
- //加入打折情况
- switch (cbxType.SelectedIndex)
- {
- case :
- totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text);
- break;
- case :
- totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.8;
- break;
- case :
- totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.7;
- break;
- case :
- totalPrices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.5;
- break;
- }
- //将每个商品合计计入总计
- total = total + totalPrices;
- //在列表框中显示信息
- lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtNum.Text + " 合计:" + totalPrices.ToString());
- //在lblTotalShow标签上显示总计数
- lblTotalShow.Text = total.ToString();
- }
- private void frmMain_Load(object sender, EventArgs e)
- {
- cbxType.SelectedIndex = ;
- }
- private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)
- {
- //数字0~9所对应的keychar为48~57
- e.Handled = true;
- //输入0-9
- if ((e.KeyChar >= && e.KeyChar <= ) || e.KeyChar == )
- {
- e.Handled = false;
- }
- }
- private void txtNum_KeyPress(object sender, KeyPressEventArgs e)
- {
- //数字0~9所对应的keychar为48~57
- e.Handled = true;
- //输入0-9
- if ((e.KeyChar >= && e.KeyChar <= ) || e.KeyChar == )
- {
- e.Handled = false;
- }
- }
- private void btnReset_Click(object sender, EventArgs e)
- {
- total = 0.0;
- txtPrice.Text = "";
- txtNum.Text = "";
- lblTotalShow.Text = "";
- lbxList.Items.Clear();
- cbxType.SelectedIndex = ;
- }
- }
- }
简单的工厂模式在WinForm中的应用
现在又根据市场情况,添加此类需求——“满300送100、满200送50等等“
面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类,打一折和打九折只是形式的不同,抽象分析出来,所有的打折算法都是一样的,所以打折算法应该是一个类;而”满300送100“等等,返利算法应该是另一个类。
代码(v1.2)


- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- //现金收取父类
- abstract class CashSuper
- {
- //抽象方法:收取现金,参数为原价,返回为当前价
- public abstract double acceptCash(double money);
- }
- }


- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- //正常消费,继承CashSuper
- class CashNormal:CashSuper
- {
- public override double acceptCash(double money)
- {
- return money;
- }
- }
- }


- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- //打折收费消费,继承CashSuper
- class CashRebate:CashSuper
- {
- private double moneyRebate = 1d;
- //初始化时,必需要输入折扣率,如八折,就是0,8
- public CashRebate(string moneyRebate)
- {
- //界面向类传值
- this.moneyRebate = double.Parse(moneyRebate);
- }
- public override double acceptCash(double money)
- {
- return money * moneyRebate;
- }
- }
- }


- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- //返利收费
- class CashReturn:CashSuper
- {
- private double moneyCondition = 0.0d;
- private double moneyReturn = 0.0d;
- //初始化时必须要输入返利条件和返利值,比如满300返100
- //则moneyCondition为300,moneyReturn为100
- public CashReturn(string moneyCondition, string moneyReturn)
- {
- this.moneyCondition =double.Parse(moneyCondition);
- this.moneyReturn = double.Parse(moneyReturn);
- }
- public override double acceptCash(double money)
- {
- double result = money;
- //若大于返利条件,则需要减去返利值
- if (money >= moneyCondition)
- {
- result = money - Math.Floor(money / moneyCondition) * moneyReturn;
- }
- return result;
- }
- }
- }
//简单工厂模式类
- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- //收费对象生成工厂
- class CashFactory
- {
- //根据条件返回相应的对象
- public static CashSuper createCashAccept(string type)
- {
- CashSuper cs = null;
- switch (type)
- {
- case "正常消费":
- cs = new CashNormal();
- break;
- case "满300返100":
- cs = new CashReturn("", "");
- break;
- case "打8折":
- cs = new CashRebate("0.8");
- break;
- case "打7折":
- cs = new CashRebate("0.7");
- break;
- case "打5折":
- cs = new CashRebate("0.5");
- break;
- }
- return cs;
- }
- }
- }
//在WinForm中调用
- namespace ExtendDiscountOfSimpleFactoryPattern
- {
- public partial class frmMain :Skin_Metro
- {
- public frmMain()
- {
- InitializeComponent();
- }
- //客户端窗体程序
- CashSuper cSuper;//声明一个父类对象
- //声明一个double变量total来计算总计
- double total = 0.0d;
- private void btnConfirm_Click(object sender, EventArgs e)
- {
- //声明一个double变量totalPrices
- double totalPrices = 0d;
- //利用简单工厂模式根据下拉选择框,生成相应的对象
- cSuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());
- totalPrices = cSuper.acceptCash(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
- //将每个商品合计计入总计
- total = total + totalPrices;
- //在列表框中显示信息
- lbxList.Items.Add("单价:" + txtPrice.Text + " 数量:" + txtNum.Text + " 合计:" + totalPrices.ToString());
- //在lblTotalShow标签上显示总计数
- lblTotalShow.Text = total.ToString();
- }
- private void btnReset_Click(object sender, EventArgs e)
- {
- total = 0.0;
- txtPrice.Text = "";
- txtNum.Text = "";
- lblTotalShow.Text = "";
- lbxList.Items.Clear();
- cbxType.SelectedIndex = ;
- }
- private void txtNum_KeyPress(object sender, KeyPressEventArgs e)
- {
- //数字0~9所对应的keychar为48~57
- e.Handled = true;
- //输入0-9
- if ((e.KeyChar >= && e.KeyChar <= ) || e.KeyChar == )
- {
- e.Handled = false;
- }
- }
- private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)
- {
- //数字0~9所对应的keychar为48~57
- e.Handled = true;
- //输入0-9
- if ((e.KeyChar >= && e.KeyChar <= ) || e.KeyChar == )
- {
- e.Handled = false;
- }
- }
- private void frmMain_Load(object sender, EventArgs e)
- {
- //在窗体加载的时候,下拉选择框,就选择索引为0的元素——"正常消费"
- cbxType.SelectedIndex = ;
- }
- }
- }
读《大话设计模式》——应用工厂模式的"商场收银系统"(WinForm)的更多相关文章
- 读《大话设计模式》——应用策略模式的"商场收银系统"(WinForm)
策略模式的结构 这个模式涉及到三个角色: 环境(Context)角色:持有一个 Strategy 类的引用.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所 ...
- 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#
负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...
- 大话设计模式之工厂模式 C#
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...
- 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例
1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...
- javascript 写策略模式,商场收银打折优惠策略
[Decode error - output not utf-8] ----------------------------- 购物清单 方便面 : 100 x 50 = 5000 | 4000 菊花 ...
- php 商场收银收费系统,使用的策略模式
<?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是 //策略模式 优惠系统.工资计算系统 ...
- C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone
C# Json反序列化 Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
- linkin大话设计模式--抽象工厂
linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了 现在要是还想彻底解耦的话怎么办呢 ...
随机推荐
- curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to storage.googleapis.com:443
安装nvm的时候, ➜ ~ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash 错 ...
- Jupyter的搭建
在家实在无聊,伏案沉思良久,忽然灵机一动,何不写写Python?然而电脑上的软件早已人是物非,Pycharm已然不复存在.但是又不想装软件找激活码,于是,只好建个Jupyter先凑合一下. 1. 安装 ...
- Docker_01
目录 1.1 Docker简介 1.1.1 为什么会有Docker的出现? 1.1.2 Docker理念 1.1.3 Docker or 虚拟机? 2.1 Docker安装 3.1 Docker基本使 ...
- 2019-02-12 html的初步学习
前两天看了下python的爬虫,后面的抓包模拟登录实在是难弄,于是暂时放弃,来学学前端知识QAQ <!DOCTYPE html>文档类型符合HTML5标准 <html lang=&q ...
- ULVAC爱发科皮拉尼真空计SW1-N说明书-手册
ULVAC爱发科皮拉尼真空计SW1-N1/N2/N SWP-16-N/传感器单元规管 https://wenku.baidu.com/view/cff03803a6c30c2259019ef5.htm ...
- JS新界面关闭原界面刷新的多种形式
------------恢复内容开始------------ 1.新界面为当前界面弹出的形式: 第一步:首先原界面的原生JS事件需要放到 (function () { ...... })(); 中 ...
- #linux vscode 保存总提示“Retry as sudo”
linux中,对不同路径下的文件,系统默认指定了不同的操作权限(读/写/执行),出现这个问题是由于文件的权限不足造成的.(路径为/opt/lampp/htdocs/LearnPHP_jayce/hel ...
- RabbitMQ入门,我是动了心的
人一辈子最值得炫耀的不应该是你的财富有多少(虽然这话说得有点违心,呵呵),而是你的学习能力.技术更新迭代的速度非常快,那作为程序员,我们就应该拥有一颗拥抱变化的心,积极地跟进. 在 RabbitMQ ...
- selenium3.0-selenium发展史
- ssh生成单个公钥
ssh生成单个公钥命令: ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 查看公钥: cat ~/.ssh/id_rsa ...