问题:商场促销问题,针对不同的顾客有不同的打折方式,计算实际应付金额
分析:1.各种促销手段下应付金额的计算方式中均有“获得商品正常销售价格,输出优惠后顾客应付金额”的步骤,因此可以抽象一个收费类,各种优惠活动的具体实现方法类来继承这个抽象类;2.具体情况下应该选择实现哪个优惠策略
抽象类和具体策略实现类代码:
//抽象一个收费类
abstract class CashSuper
{
public abstract double acceptCash(double money);
}
//正常收费类
class CashNormal : CashSuper
{
public override double acceptCash(double money)
{
return money;
}
}
//打折收费子类
class CashRebate : CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRabe)
{
this.moneyRebate = double.Parse(moneyRabe);
}
public override double acceptCash(double money)
{
return money * moneyRebate;
}
}
选择哪个类来实现,方法一:简单工厂来实现
//现金收费工厂类
class CashFactory
{
public static CashSuper createCashAccept(string type)
{
CashSuper cs = null;
switch (type)
{
case"正常收费":
cs = new CashNormal();
break;
case "打八折":
CashRebate cr = new CashRebate("0.8");
cs = cr;
break;
}
return cs;
}
}
客户端代码:
CashSuper csuper = CashFactory.createCashAccept(cmbType.SelectedItem.ToString()); //工厂类中选择要实例化哪个具体优惠方法类
double totalPrices = 0d;
totalPrices = csuper.acceptCash(Convert.ToDouble(textBox2.Text) * Convert.ToDouble(textBox1.Text));
total = total + totalPrices;
textBox3.Text = total.ToString();
类图:
从图中可以看出,若商店要增加一种促销策略,如:现有“正常售价”和”打八折”,若想再增加一种“打五折”的活动,其实跟打八折实质是一样的不需要增加算法类,但是需要在工厂中加case判断条件,在form下拉框中做相应改动;若想增加“满多少减多少”的活动,相当于增加一种新的算法,需要在增加一个算法类继承抽象的收费类,再在工厂中加case条件,改动下拉框。
选择哪个类来实现,方法二:策略模式实现
class CashContext
{
private CashSuper cs;
public CashContext(CashSuper csuper)
{
this.cs = csuper; //具体的收费策略
}
public double GetResult(double money)
{
return cs.acceptCash(money); //获取优惠活动后,顾客应付金额数
}
}
客户端代码:
CashContext cc = null;
switch(cmbType.SelectedItem.ToString())
{
case"正常收费":
cc = new CashContext(new CashNormal());
break;
case"打八折":
cc = new CashContext(new CashRebate("0.8"));
break;
}
double totalPrices = 0d;
totalPrices = cc.GetResult(Convert.ToDouble(textBox2.Text) * Convert.ToDouble(textBox1.Text));
total = total + totalPrices;
textBox3.Text = total.ToString();
类图:
简单工厂实现时,客户端需要认识两个类CashSuper和CashFactory,工厂类来判断new哪个具体类;策略模式客户端只需要认识一个类(降低耦合),得到一个结果。