计算器的类设计-工厂模式

上传人:xmg****18 文档编号:113667815 上传时间:2019-11-09 格式:PPTX 页数:36 大小:564.10KB
返回 下载 相关 举报
计算器的类设计-工厂模式_第1页
第1页 / 共36页
计算器的类设计-工厂模式_第2页
第2页 / 共36页
计算器的类设计-工厂模式_第3页
第3页 / 共36页
计算器的类设计-工厂模式_第4页
第4页 / 共36页
计算器的类设计-工厂模式_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《计算器的类设计-工厂模式》由会员分享,可在线阅读,更多相关《计算器的类设计-工厂模式(36页珍藏版)》请在金锄头文库上搜索。

1、设计模式(Design Pattern),解决重复设计问题 反复出现的设计问题的解决方案 模式被用来在特定场景下,解决一般设计问题的类和相互通信的对象的描述 处理同一类软件,分析结果的典型设计结构,面向对象的七大设计原则,1.开放封闭原则OCP 2.单一职责SRP 3.里氏代换LSP 4.依赖倒转DIP 5.迪米特法则LOD 6.接口隔离ISP 7.合成聚合复用原则CARP,对扩展开放,修改封闭 职责的分离,低耦合 is-a,子类替换父类 仅通过接口和抽象类产生依赖 最少知识,最少相关 尽可能小的单独的接口 合成/聚合优先于继承,问题(Problem),实现计算器 要求输入2个数和运算符,得到

2、结果,控制台的代码,可复用其他项目?,问题(Problem),static void Main(string args) Console.Write(“请输入数字A:“); string strNumberA = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*、/):“); string strOperate = Console.ReadLine(); Console.Write(“请输入数字B:“); string strNumberB = Console.ReadLine(); string strResult = “; switch (s

3、trOperate) case “+“: strResult = (double.Parse(strNumberA) + double.Parse(strNumberB).ToString(); break; case “-“: strResult = (double.Parse(strNumberA) - double.Parse(strNumberB).ToString(); break; case “*“: strResult = (double.Parse(strNumberA) * double.Parse(strNumberB).ToString(); break; case “/

4、“: if (strNumberB != “0“) strResult = (double.Parse(strNumberA) / double.Parse(strNumberB).ToString(); else strResult = “除数不能为0“; break; Console.WriteLine(“结果是:“ + strResult); Console.ReadLine(); ,问题(Problem),实现计算器 Ctrl+C 和 Ctrl+V 维护的时候,带来灾难 尽可能的办法去避免重复,通过面向对象设计, 让数据计算和用户交互方式分开,单一职责原则 数据计算和用户交互方式分开,

5、class Operation public static double GetResult(double numberA, double numberB, string operate) double result = 0; switch (operate) case “+“: result = numberA + numberB; break; case “-“: result = numberA - numberB; break; case “*“: result = numberA * numberB; break; case “/“: result = numberA / numbe

6、rB; break; return result; ,static void Main(string args) try Console.Write(“请输入数字A:“); string strNumberA = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*、/):“); string strOperate = Console.ReadLine(); Console.Write(“请输入数字B:“); string strNumberB = Console.ReadLine(); string strResult = “; strResult

7、 = Operation.GetResult(double.Parse(strNumberA), double.Parse(strNumberB), strOperate).ToString(); Console.WriteLine(“结果是:“ + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(“您的输入有错:“ + ex.Message); ,单一职责原则 数据计算和用户交互方式分开,private void btnNum_Click(object sender, EventArgs e) if

8、 (bOperate) textBox1.Text = “; bOperate = false; textBox1.Text = textBox1.Text + (Button)sender).Text; private void btnOpertor_Click(object sender, EventArgs e) if (textBox1.Text != “) operate = (Button)sender).Text; numberA = double.Parse(textBox1.Text); bOperate = true; private void btnEqu_Click(o

9、bject sender, EventArgs e) if (textBox1.Text != “) numberB = double.Parse(textBox1.Text); textBox1.Text = Operation.GetResult( numberA, numberB, operate ).ToString(); bOperate = true; ,bool bOperate = false; double numberA = 0; double numberB = 0; string operate = “;,单一职责原则 数据计算和用户交互方式分开,扩展问题(Proble

10、m),添加平方根运算,紧耦合 vs 松耦合 Switch中添加一个分支,搞定! 缺点:运算 + - * / 的代码GetResult是正确的,却需要在修改的时候暴露? 如何修改或添加新运算,不影响其它的运算代码?,对扩展开放,对修改关闭:不被修改的前提下被扩展,所有面向对象原则的核心。 软件设计本身所追求的目标就是封装变化、降低耦合,而开放封闭原则正是对这一目标的最直接体现。,开放封闭原则(OCP,Open Closed Principle),其核心的思想是: 软件实体应该是可扩展,而不可修改的。 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。 对修改封闭,意味

11、着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。,实现开放封闭的核心思想就是对抽象编程,而不对具体编程,因为抽象相对稳定。 让编程依赖于固定的抽象,所以对修改就是封闭的;而通过面向对象的继承和对多态机制,可以实现对抽象体的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,所以对于扩展就是开放的。,开放封闭原则,不被修改的前提下被扩展,添加新的运算,满足开放封闭原则!,不被修改的前提下被扩展,class Operation private double _numberA = 0; private double _numberB = 0; public double Numbe

12、rA get return _numberA; set _numberA = value; public double NumberB get return _numberB; set _numberB = value; public virtual double GetResult() return 0; ,不被修改的前提下被扩展,/ 加法类 class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result

13、; / 减法类 class OperationSub : Operation public override double GetResult() double result = 0; result = NumberA - NumberB; return result; ,/ 乘法类 class OperationMul : Operation public override double GetResult() double result = 0; result = NumberA * NumberB; return result; / 除法类 class OperationDiv : Op

14、eration public override double GetResult() double result = 0; if (NumberB = 0) throw new Exception(“除数不能为0。“); result = NumberA / NumberB; return result; ,问题(Problem),static void Main(string args) try Console.Write(“请输入数字A:“); string strNumberA = Console.ReadLine(); Console.Write(“请选择运算符号(+、-、*、/):“

15、); string strOperate = Console.ReadLine(); Console.Write(“请输入数字B:“); string strNumberB = Console.ReadLine(); string strResult = “; / strResult = Operation.GetResult( double.Parse(strNumberA), double.Parse(strNumberB), strOperate).ToString(); if (strOperate = “+“) OperationAdd add = new OperationAdd(); add.NumberA = double.Parse(strNumberA); add.NumberB = double.Parse(strNumberB); strResult = add.GetResult().ToString(); Console.WriteLine(“结果是:“ + strResult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(“您的输入有错:“ + ex.Message); ,新问题:虽然满足了开放封闭原则,单一职责原则, 但是众多类,使用起来非常

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号