策略模式
先看代码

Code
using System;
namespace xiaopeng.DH
{
/// <summary>
/// 抽象现金类
/// </summary>
public abstract class Cash
{
//现金收取方法
public abstract double AcceptCash(double money);
}
/// <summary>
/// 正常收费类
/// </summary>
public class CashNormal : Cash
{
public override double AcceptCash(double money)
{
return money;
}
}
/// <summary>
/// 打折收费类
/// </summary>
public class CashRebate : Cash
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}
public override double AcceptCash(double money)
{
return money * moneyRebate;
}
}
public class CashReturn : Cash
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition, string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double AcceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
return result;
}
}
/// <summary>
/// 消费工厂
/// </summary>
public class CashFactory
{
public static Cash CreateCashAccept(string type)
{
Cash cs = null;
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300", "100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
return cs;
}
}
/// <summary>
/// 使用策略模式
/// </summary>
public class CashContext
{
Cash cs = null;
public CashContext(string type)
{
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300", "100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
}
public double GetResult(double money)
{
return cs.AcceptCash(money);
}
}
class Cash_run
{
static void Main(string[] args)
{
Console.WriteLine("-------------使用简单工厂模式-------------");
Cash cs = CashFactory.CreateCashAccept("正常收费");
Console.WriteLine("消费400元:");
Console.WriteLine("正常消费费用为:" + cs.AcceptCash(400).ToString());
cs = CashFactory.CreateCashAccept("满300返100");
Console.WriteLine("满300返100消费费用为:" + cs.AcceptCash(400).ToString());
cs = CashFactory.CreateCashAccept("打8折");
Console.WriteLine("打八折消费费用为:" + cs.AcceptCash(400));
Console.WriteLine("-------------使用策略模式-------------");
CashContext csuper = new CashContext("正常收费");
Console.WriteLine("消费400元:");
Console.WriteLine("正常消费费用为:" + csuper.GetResult(400).ToString());
csuper = new CashContext("满300返100");
Console.WriteLine("满300返100消费费用为:" + csuper.GetResult(400).ToString());
csuper = new CashContext("打8折");
Console.WriteLine("打八折消费费用为:" + csuper.GetResult(400).ToString());
}
}
}
这个代码,是照书上的例子照搬下来的,代码比较简洁,也很容易理解,主要是对超市销售货物进行结账的一种模拟程序,对超市出现的按原价销售,返现金,打折进行封装,上面的客户端程序,我提供了两种,一种是简单工厂模式,一个是策略模式与简单工厂模式的组合。相比之下,我更喜欢第二中,因为,使用策略模式与简单工厂模式的结合,将策略方法封装的更好,用户只知道CashContext类,对其它的不知道,这样更容易保护自己的策略类了。而第一种也同样解决了问题,但是我们要知道两个类(Cash,CashFactory)另外我们要用Cash类的AcceptCash方法,来获取当前使用的消费类型所应该付的金钱树,对用户来说暴露我的内及内部结构。示例代码
using System;
namespace xiaopeng.DH
{
/// <summary>
/// 抽象现金类
/// </summary>
public abstract class Cash
{
//现金收取方法
public abstract double AcceptCash(double money);
}
/// <summary>
/// 正常收费类
/// </summary>
public class CashNormal : Cash
{
public override double AcceptCash(double money)
{
return money;
}
}
/// <summary>
/// 打折收费类
/// </summary>
public class CashRebate : Cash
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}
public override double AcceptCash(double money)
{
return money * moneyRebate;
}
}
public class CashReturn : Cash
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition, string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);
this.moneyReturn = double.Parse(moneyReturn);
}
public override double AcceptCash(double money)
{
double result = money;
if (money >= moneyCondition)
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
return result;
}
}
/// <summary>
/// 消费工厂
/// </summary>
public class CashFactory
{
public static Cash CreateCashAccept(string type)
{
Cash cs = null;
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300", "100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
return cs;
}
}
/// <summary>
/// 使用策略模式
/// </summary>
public class CashContext
{
Cash cs = null;
public CashContext(string type)
{
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300", "100");
break;
case "打8折":
cs = new CashRebate("0.8");
break;
}
}
public double GetResult(double money)
{
return cs.AcceptCash(money);
}
}
class Cash_run
{
static void Main(string[] args)
{
Console.WriteLine("-------------使用简单工厂模式-------------");
Cash cs = CashFactory.CreateCashAccept("正常收费");
Console.WriteLine("消费400元:");
Console.WriteLine("正常消费费用为:" + cs.AcceptCash(400).ToString());
cs = CashFactory.CreateCashAccept("满300返100");
Console.WriteLine("满300返100消费费用为:" + cs.AcceptCash(400).ToString());
cs = CashFactory.CreateCashAccept("打8折");
Console.WriteLine("打八折消费费用为:" + cs.AcceptCash(400));
Console.WriteLine("-------------使用策略模式-------------");
CashContext csuper = new CashContext("正常收费");
Console.WriteLine("消费400元:");
Console.WriteLine("正常消费费用为:" + csuper.GetResult(400).ToString());
csuper = new CashContext("满300返100");
Console.WriteLine("满300返100消费费用为:" + csuper.GetResult(400).ToString());
csuper = new CashContext("打8折");
Console.WriteLine("打八折消费费用为:" + csuper.GetResult(400).ToString());
}
}
}
这个代码,是照书上的例子照搬下来的,代码比较简洁,也很容易理解,主要是对超市销售货物进行结账的一种模拟程序,对超市出现的按原价销售,返现金,打折进行封装,上面的客户端程序,我提供了两种,一种是简单工厂模式,一个是策略模式与简单工厂模式的组合。相比之下,我更喜欢第二中,因为,使用策略模式与简单工厂模式的结合,将策略方法封装的更好,用户只知道CashContext类,对其它的不知道,这样更容易保护自己的策略类了。而第一种也同样解决了问题,但是我们要知道两个类(Cash,CashFactory)另外我们要用Cash类的AcceptCash方法,来获取当前使用的消费类型所应该付的金钱树,对用户来说暴露我的内及内部结构。示例代码
浙公网安备 33010602011771号