问题描述
实现一个收银程序,有3种收费方式:正常收费、打折收费(8折)、满减促销(满300-100),程序在尽量减少重复代码的前提下,实现正确的金额计算。
代码实现
收费抽象类
public abstract class CashSuper
{
public abstract double AcceptCash(double money);
}
具体的收费算法类,包括正常收费类CashNormal、打折收费类CashRebate、满减促销类CashReturn。
class CashNormal : CashSuper
{
public override double AcceptCash(double money)
{
return money;
}
}
class CashRebate : CashSuper
{
public CashRebate(double moneyRebate)
{
mMoneyRebate = moneyRebate;
}
public override double AcceptCash(double money)
{
return money * mMoneyRebate;
}
private double mMoneyRebate;
}
class CashReturn : CashSuper
{
public CashReturn(double mMoneyCondition, double mMoneyReturn)
{
this.mMoneyCondition = mMoneyCondition;
this.mMoneyReturn = mMoneyReturn;
}
public override double AcceptCash(double money)
{
if (money >= mMoneyCondition)
{
return money - Math.Floor(money / mMoneyCondition) * mMoneyReturn;
}
return money;
}
private double mMoneyCondition;
private double mMoneyReturn;
}
定义上下文类CashContext,维护对算法对象的引用
public class CashContext
{
private CashSuper cs;
public CashContext(string type)
{
switch(type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满返":
cs = new CashReturn(300,100);
break;
case "打折":
cs = new CashRebate(0.8);
break;
}
}
public double GetResult(double money)
{
return cs.AcceptCash(money);
}
}
客户端调用:
static void Main(string[] args)
{
CashContext sc1 = new CashContext("正常收费");
CashContext sc2 = new CashContext("满返");
CashContext sc3 = new CashContext("打折");
Console.WriteLine(sc1.GetResult(300));
Console.WriteLine(sc2.GetResult(300));
Console.WriteLine(sc3.GetResult(300));
}
结构组成
策略模式有三类主要角色组成:
策略类:定义所有支持算法的公共接口,这个例子中为收费抽象类
具体策略类:具体的算法,这个例子中为具体的正常收费、打折收费、满减优惠收费
上下文类:维护对策略对象的应用