商场收银改进C#版--融合了工厂和策略设计模式

简介: 其实,我自己开始没看书也作了整合。 可以运行,但代码奇丑无比。又不精简。 看了书之后,慢慢领略高手的思想吧。 主要还是对类,对象,实例,多态之类的不太熟悉。 有信心慢慢练习中。。。 1 double total = 0.

其实,我自己开始没看书也作了整合。

可以运行,但代码奇丑无比。又不精简。

看了书之后,慢慢领略高手的思想吧。

主要还是对类,对象,实例,多态之类的不太熟悉。

有信心慢慢练习中。。。

 1     double total = 0.0d;
 2         private void MainFormLoad(object sender, EventArgs e)
 3         {
 4             cbxType.Items.AddRange(new object[] {"正常收费","满300返100","打8折"});
 5             cbxType.SelectedIndex = 0;
 6         }
 7         
 8         void Button1Click(object sender, System.EventArgs e)
 9         {
10             CashContext cc = new CashContext(cbxType.SelectedItem.ToString());
11             double totalPrices = 0d;
12             totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text)
13                                             * Convert.ToDouble(txtNum.Text));
14             total = total + totalPrices;
15             lbxList.Items.Add("单价: " + txtPrice.Text + "   数量: " + txtNum.Text +  " " 
16                               + cbxType.SelectedItem + "   合计: " + totalPrices.ToString());
17             lblResult.Text = total.ToString();
18         }
19         
20         void Button2Click(object sender, EventArgs e)
21         {
22             txtPrice.Text = Convert.ToString(0.00);
23             txtNum.Text = Convert.ToString(0);
24             lblResult.Text = Convert.ToString(0.00);
25             lbxList.Items.Clear();
26             cbxType.SelectedIndex = 0;
27             
28         }
29         
30     }
31     abstract class CashSuper
32     {
33         public abstract double acceptCash(double money);
34     }
35     class CashNormal : CashSuper
36     {
37         public override double acceptCash(double money)
38         {
39             return money;
40         }
41     }
42     class CashRebate : CashSuper
43     {
44         private double moneyRebate = 1d;
45         public CashRebate(string moneyRebate)
46         {
47             this.moneyRebate = double.Parse(moneyRebate);
48         }
49         public override double acceptCash(double money)
50         {
51             return money * moneyRebate;
52         }
53     }
54     class CashReturn : CashSuper
55     {
56         private double moneyCondition = 0.0d;
57         private double moneyReturn = 0.0d;
58         public CashReturn(string moneyCondition, string moneyReturn)
59         {
60             this.moneyCondition = double.Parse(moneyCondition);
61             this.moneyReturn = double.Parse(moneyReturn);
62         }
63         public override double acceptCash(double money)
64         {
65             double result = money;
66             if(money >= moneyCondition)
67                 result = money - Math.Floor(money / moneyCondition) * moneyReturn;
68             
69             return result;
70         }
71     }
72     
73     class CashContext
74     {
75         CashSuper cs = null;
76     
77         public  CashContext(string type)
78         {
79             switch (type)
80             {
81                 case "正常收费":
82                     CashNormal cs0= new CashNormal();
83                     cs = cs0;
84                     break;
85                 case "满300返100":
86                     CashReturn cr1 = new CashReturn("300", "100");
87                     cs = cr1;
88                     break;
89                 case "打8折":
90                     CashRebate cr2 = new CashRebate("0.8");
91                     cs = cr2;
92                     break;
93             }
94         }
95         public double GetResult(double money)
96         {
97             return cs.acceptCash(money);
98         }
99     }

输出:

目录
相关文章
|
5天前
|
设计模式 Java
课时89:工厂设计模式
课时89介绍工厂设计模式(Factory),涵盖接口的定义与使用、程序结构设计及工厂设计的核心概念。通过实例代码展示如何利用接口实现子类的向上转型,并通过工厂类解耦主类与子类的关系,从而实现更灵活和可扩展的设计。工厂模式使客户端无需关心具体子类的创建过程,仅需通过工厂类获取对象实例,简化了系统的维护和扩展。
|
2月前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
92 40
|
7月前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
3月前
|
缓存 API C#
C# 一分钟浅谈:GraphQL 中的缓存策略
本文介绍了在现代 Web 应用中,随着数据复杂度的增加,GraphQL 作为一种更灵活的数据查询语言的重要性,以及如何通过缓存策略优化其性能。文章详细探讨了客户端缓存、网络层缓存和服务器端缓存的实现方法,并提供了 C# 示例代码,帮助开发者理解和应用这些技术。同时,文中还讨论了缓存设计中的常见问题及解决方案,如缓存键设计、缓存失效策略等,旨在提升应用的响应速度和稳定性。
63 13
|
4月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
64 2
|
6月前
|
编译器 C# Android开发
震惊!Uno Platform 与 C# 最新特性的完美融合,你不可不知的跨平台开发秘籍!
Uno Platform 是一个强大的跨平台应用开发框架,支持 Windows、macOS、iOS、Android 和 WebAssembly,采用 C# 和 XAML 进行编程。C# 作为其核心语言,持续推出新特性,如可空引用类型、异步流、记录类型和顶级语句等,极大地提升了开发效率。要在 Uno Platform 中使用最新 C# 特性,需确保开发环境支持相应版本,并正确配置编译器选项。通过示例展示了如何在 Uno Platform 中应用可空引用类型、异步流、记录类型及顶级语句等功能,帮助开发者更好地构建高效、优质的跨平台应用。
314 59
|
5月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
189 1
|
5月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
6月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
7月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
99 1