策略模式,看完策略模式最大的感受就是将所有的算法封装起来,让它们之间可以相互替换,这个模式让算法的变化不会影响到使用者。
我写的例子还是之前的那个简易计算器,策略模式可以和简单工厂模式结合,在客户端中只需认识一个concent类,将所有的算法对象创建以及算法的使用全部封装在一个类中,即concent,通过传入的操作符来创建不同的对象,然后用算法基类的对象访问不同子类的算法结果。
程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 策略模式
{
class Program
{
static void Main(string[] args)
{
double a, b;
string opt;
Console.WriteLine("请输入一个数:");
a = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("请输入运算符:");
opt = Console.ReadLine();
Console.WriteLine("请输入另一个数:");
b = Convert.ToDouble(Console.ReadLine());
Concent opter = new Concent(opt, a, b);
Console.WriteLine("结果为:" + opter.getresult());
}
}
class Concent
{
Opter opter;
public Concent(string opt, double a, double b)
{
switch (opt)
{
case "+":
{
opter = new ADDopter();
break;
}
case "-":
{
opter = new SUBopter();
break;
}
case "*":
{
opter = new MULopter();
break;
}
case "/":
{
opter = new DIVopter();
break;
}
}
opter.NUM1 = a;
opter.NUM2 = b;
}
public double getresult()
{
return opter.getresult();
}
}
abstract class Opter
{
private double num1, num2;
public double NUM1
{
get { return num1; }
set { num1 = value; }
}
public double NUM2
{
get { return num2; }
set { num2 = value; }
}
public abstract double getresult();
}
class ADDopter : Opter
{
public override double getresult()
{
return NUM1 + NUM2;
}
}
class SUBopter : Opter
{
public override double getresult()
{
return NUM1 - NUM2;
}
}
class MULopter : Opter
{
public override double getresult()
{
return NUM1 * NUM2;
}
}
class DIVopter : Opter
{
public override double getresult()
{
if (NUM2 == 0)
{
Console.WriteLine("除数不能为0");
return 0.0;
}
else
{
return NUM1 / NUM2;
}
}
}
}