计算器设计
做软件这个行业,我们必须知道,用户的需求是不断变化的,有时候,用户提的要求可能非常不过分,只是改动一些表面的小地方。但是面对已完成的代码,却是需要几乎重头来过的尴尬,实在痛苦不堪。
之所以会出现这种状况,就是因为我们原先所写的程序,不容易维护,灵活性差,不容易扩展,更谈不上复用了。
面向对象分析设计编程思想,通过封装、继承、多态把程序的耦合度降低,将功能按块儿进行划分,降低彼此之间的耦合度。而设计模式使得程序更加灵活,容易修改,并且易于复用。
对于计算器这个程序,我们本可以直接用计算机能够理解的逻辑来描述和表达解决的问题及具体的求解过程。先要求输入两个数和运算符号,然后根据运算符号判断选择如何运算,得到结果。这样算根本没有什么错误,也能够很好的实现我们当时所需的功能。
但是这样的不容易维护,不容易扩展,更不容易复用。当我们需要增加平方根、立方根、自然对数、正弦余弦等运算的时候,修改起来比较复杂,一不小心会修改错,导致其他的功能出现错误。
下面是运用工厂模式,只要输入运算符号,工厂就实例化出合适的对象,通过多态返回父类的方式实现计算结果。
首先是Operation运算类。该类中包含两个用于计算器前后数的可读可写的属性和一个虚方法
#region Operation运算类 public class Operation { private double _numberA = 0; private double _numberB = 0; //NumberA是一个属性,该属性有两个方法:get和set public double NumberA { get { return _numberA; } set {_numberA =value; } } public double NumberB { get { return _numberB; } set { _numberB = value; } } //GetResult是一个方法,虚方法 public virtual double GetResult() { double result=0; return result; } } #endregion
接下来分别用加减乘除四个类去继承上面的运算类,重写父类的虚方法
#region 加法类继承运算类 class OperationAdd : Operation { //重写父类中GetResult虚方法,定义为加法 public override double GetResult() { double result = 0; result = NumberA + NumberB; return result; } } #endregion #region 减法类继承运算类 class OperationSub : Operation { //重写父类中GetResult虚方法,定义为减法 public override double GetResult() { double result = 0; result = NumberA - NumberB; return result; } } #endregion #region 乘法继承运算类 class OperationMul : Operation { //重写父类中GetResult虚方法,定义为乘法 public override double GetResult() { double result = 0; result = NumberA * NumberB; return result; } } #endregion
写完这五个类,但是问题也来了,我么如何让计算器知道我我们用哪一个算法呢?下面就要用到简单工厂模式:
#region 简单工厂 //只需要输入运算符,工厂就会实例化出合适的对象,通过多态返回父类的方式实现了计算器的结果 public class OperationFactory { public static Operation createOperate(string operate) { Operation oper = null; switch (operate) { case "+": oper=new OperationAdd (); break; case "-": oper=new OperationSub(); break; case "*": oper=new OperationMul(); break; case "/": oper = new OperationDiv(); break; } return oper; } } #endregion
客户端的代码指需要这样:
#region 客户端代码 class Program { //通过多态,返回父类的方式实现了计算器的结果 static void Main(string[] args) { Operation oper; oper = OperationFactory.createOperate("+"); oper.NumberA =1; oper.NumberB=2; double result=oper.GetResult (); Console.WriteLine("您的运算结果是:"+result ); Console.ReadLine(); } }
通过以上的代码,我们就很好的将计算部分和显示部分分开了。我们再增加算法的时候,只需按照加减乘除四个类增加相应的类,在再格式工厂中增加相应的判断分支就好了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构