主要利用工厂模式来实现了一个计算器,将加减乘除操作分离了开来,实现了低耦合的目标。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 设计模式___计算器
{
public class Operation
{
double numA;
public double NumA
{
get
{
return numA;
}
set
{
numA = value;
}
}
double numB;
public double NumB
{
get
{
return numB;
}
set
{
numB = value;
}
}
public virtual string GetResult()//将这个方法写成虚拟的,方便下面的加减乘除按照各自的需要在对方法进行重写即可。
{
return "error";
}
}
class OperationAdd : Operation
{
public override string GetResult()//重写GetResult()方法,实现两数想加的功能。
{
return (NumA + NumB).ToString();
}
}
class OperationSub : Operation
{
public override string GetResult()//重写了GetResult()方法,实现了两数相减的功能。
{
return (NumA - NumB).ToString();
}
}
class OperationChen : Operation
{
public override string GetResult()//重写GetResult()方法,实现了两数相乘的目标。
{
double result = NumA * NumB;
return result.ToString();
}
}
class OperationChu : Operation
{
public override string GetResult()//重写GetResult()方法,实现两数相除的目标。
{
double result;
if (NumB == 0)//注意判定被除数是否为零的问题。
{
return "除数不能为空!";
}
else
{
result = NumA / NumB;
return result.ToString();
}
}
}
public class OperationFactory
{
public static Operation GetOperation(string str)//写了一个静态方法,实现了根据不同的运算符来构造不同的运算对象。
{
Operation p = new Operation();//由于Operation为基类,所以它可以接受其他的子类。
switch (str)
{
case "+": p = new OperationAdd(); break;
case "-": p = new OperationSub(); break;
case "*": p = new OperationChen(); break;
case "/": p = new OperationChu(); break;
}
return p;
}
}
class Program
{
static void Main(string[] args)
{
int numA, numB;
string C;
string result = null;
Console.WriteLine("请输入第一个数:\n");
numA = int.Parse(Console.ReadLine());
Console.WriteLine("请输入操作符:\n");
C = Console.ReadLine();
Console.WriteLine("请输入第二个数:\n");
numB = int.Parse(Console.ReadLine());
Operation p = OperationFactory.GetOperation(C);
p.NumA = numA;
p.NumB = numB;
Console.WriteLine("结果为:\n");
Console.WriteLine(p.GetResult());
Console.ReadLine();
}
}
}