设计模式一 工厂模式 (2)
来源:互联网 发布:清华北大碾压知乎 编辑:程序博客网 时间:2024/04/29 04:28
上一节中的代码段存在一种弊端,若我们想些一个web段应用的计算器如何实现呢?直接了当-----把上一节的代码段直接拷贝过去。这就是程序员的悲哀 -----Ctrl+C 和Ctrl+V 我们可以试着将业务逻辑层和界面逻辑分开
首先这里要搞清楚的是哪里是业务逻辑层:计算方法即加减乘除运算
界面逻辑层:输入数字和数字显示结果
如下:
//Operation 运算类
public class Operation()
{
public static double GetResult(double numberA,double numberB,string operate)
{
double result = 0d;
switch(operate)
{
case "+":
result = numberA + numberB;
break;
case "-":
result = numberA - numberB;
break;
case "*":
result = numberA * numberB;
break;
case "/":
result = numberA / numberB;
break;
}
return result;
}
}
客户端代码
try
{
//输入
Console.Write("请输入数字A");
string strNumberA = Console.ReadLine();
Console.Write("请选择计算符号+,-,* ,/");
string strOperate = Console.ReadLine();
Console.Write("请输入数字B");
string strNumberB = Console.ReadLine();
string strResult = "";
strResult = Convert.ToString(Operation.GetResult(Convert.ToDouble(strNumberA),Convert.ToDouble(strNumberB),strOperate);
Console.Write("结果是:" + strResult);
}
catch (Exception ex)
{
throw ex;
}
如上业务和界面就完全分离了.以后不管Web,PDA,手机等需要运算都可以直接用它了.
不过面向对象有三大特征:封装 ,继承,多态.这里只是用到了封装特性,还有两大特性没有使用呢
我们继续学习:若对于上述计算器代码老板要求增加一个开根运算如何进行?答曰:修改operation类增加开根运算
问题来了:我们只是想增加一个开根运算而已,但是却让加减乘除的运算都要参与进来编译.若我们一不小心把加法改成减法,岂不更糟
根本对策:把加减乘除等运算分离,修改其中一个不受影响.
如下代码:
//Operation运算类
public class Operation
{
private double _numberA = 0;
private double _numberB = 0;
public double NumberA
{
get { return _numberA; }
set { _numberA = value; }
}
public double NumberB
{
get { return _numberB; }
set { _numberB = value; }
}
public virtual double GetResult()
{
double result = 0;
return result;
}
}
//加减乘除类
class OpertionAdd : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA + NumberB;
return result;
}
}
class OpertionSub : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA - NumberB;
return result;
}
}
class OpertionMul : Operation
{
public override double GetResult()
{
double result = 0;
result = NumberA * NumberB;
return result;
}
}
class OpertionDiv : Operation
{
public override double GetResult()
{
double result = 0;
if (NumberB == 0)
{
throw new Exception("除数不能为0");
}
result = NumberA / NumberB;
return result;
}
}
上面已经圆满的解决了上述的问题,但是新的问题又来了,我们如何让计算器知道我们希望用哪一种算法呢?
这是下一节的问题 简单工厂模式至此现身了
- 设计模式一 工厂模式 (2)
- 设计模式 2-23 工厂模式(一)
- 设计模式一:工厂模式
- 设计模式(一)----工厂模式
- 工厂设计模式一 简单工厂模式
- 设计模式--工厂设计模式(一)
- 设计模式一 简单工厂设计模式
- 设计模式一 简单工厂
- 设计模式一:工厂方法
- 设计模式一:简单工厂
- Java设计模式:工厂模式(一)简单工厂模式
- JAVA--简单工厂模式,工厂方法模式--设计模式一
- 设计模式之工厂模式(一)之简单工厂模式
- 设计模式2-工厂模式
- 设计模式2(工厂模式)
- 设计模式2-工厂模式
- java设计模式学习(一)-工厂方法模式2
- .NET中的设计模式一:工厂模式
- 堆
- Mysql乱码问题解决方案
- 互联网企业流程部门价值方向的一些探讨
- UNIX系统
- PHP中$_SERVER的详细用法
- 设计模式一 工厂模式 (2)
- 开源SIP协议栈reSIProcate和SIPX
- Flex FTP文件上传
- 想找一个真心交流的的师父(.net&php)
- 用户sa登录失败,该用户与可信sql server连接无关联
- win7中的系统保护
- 用Java编写的简易计算器
- windows下GSL的配置
- php.ini中文解释