《计算器的类设计-工厂模式》由会员分享,可在线阅读,更多相关《计算器的类设计-工厂模式(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); ,新问题:虽然满足了开放封闭原则,单一职责原则, 但是众多类,使用起来非常