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

  

  核心代码(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)的更多相关文章

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

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

  2. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...

  3. 大话设计模式之工厂模式 C#

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 大话设计模式一书中第一个开讲的设计模式是简单工厂模式,关于简单工厂模式大家可参考鄙人的博客:代 ...

  4. 大话设计模式--抽象工厂模式 Abstract Factory -- C++实现实例

    1. 抽象工厂模式: 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类. 下面是工厂方法模式: 下面是抽象工厂模式: 和工厂方法模式相比 抽象工厂模式可以有多个Product抽象, ...

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

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

  6. php 商场收银收费系统,使用的策略模式

    <?php//策略模式就是你有很多的方法,选择一种适合自己的,// 单例模式就是只有一个实例对象,不需要每个文件都要加载,比如连接数据库,// 工厂模式就是 //策略模式 优惠系统.工资计算系统 ...

  7. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  8. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  9. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

随机推荐

  1. RabbitMQ系列之【启动过程中遇到问题及解决方案】

    1.如果显示找不到主机,请在hosts文件中添加: vi /etc/hosts 127.0.0.1 localhost 2.从3.3.1版本开始,RabbitMQ默认不允许远程ip登录,即只能使用lo ...

  2. EIGRP-12-弥散更新算法-DUAL的FSM(*没写完)

    FD (可行距离).后继和可行后继.本地计算和弥散计算(随着查询包的发出而扩散,随着响应包的接收而收敛)一到目前为止介绍的这些机制能够使路由器有效地计算出去往某目地的新路径,只要在整个弥散计算中不再出 ...

  3. 手写网页扫雷之css部分

    #ui{ text-align: center; } #saolei{ width: 500px; height: 500px; border: 1px solid #456345; margin: ...

  4. RESTORE FILELISTONLY FROM DISK ='D:\DataSQL\BakFile\pubs.bak' _ 数据库安装工具_连载_4

    在查询分析器中执行:  RESTORE FILELISTONLY FROM DISK = 'D:\DataSQL\BakFile\pubs.bak'根据查询类型判断Type(D.L),再取得对应的Lo ...

  5. mysql小数类型

    原文链接:https://blog.csdn.net/weixin_42047611/article/details/81449663 MySQL 中使用浮点数和定点数来表示小数. 浮点类型有两种,分 ...

  6. WeChair项目Alpha冲刺(3/10)

    团队项目进行情况 1.昨日进展    Alpha冲刺第三天 昨日进展: 前端初步完成小程序预约页的html+css设计 后端springboot项目测试运行HelloWorld通过,以及LoginCo ...

  7. 有趣的条漫版 HashMap,25岁大爷都能看懂

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  8. Java WebService学习笔记 - Axis进阶(二)

    上一篇  Java WebService学习笔记 - Axis(一) 前一篇博文中简单介绍了Axis的使用方法,这篇将介绍一些Axis的一些高级特性 Axis中Handler的使用 Handler ...

  9. eclipse使用git提交代码

    准备工作: 目的:eclipse使用git提交本地项目,提交至远程github上 eclipse版本:eclipse4.5  64位 jdk版本:jdk-1.7 64位 项目类型:maven web项 ...

  10. Format中的转换说明符

    %a(%A) 浮点数.十六进制数字和p-(P-)记数法(C99)%c 单个字符%d 有符号十进制整数%f 浮点数(包括float和doulbe)%e(%E) 指数形式的浮点数[e-(E-)记数法]%g ...