(简单工厂模式+策略模式)实现商场打折促销收银软件

本文参考《大话设计模式》进行总结。

策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

仅简单工厂模式:

//现金收费抽象类
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;
	//打折收费,初始化时,必需要输入折扣率,如八折,就是0.8
	public CashRebate(string moneyRebate)
	{
		this.moneyRebate = double.Parse(moneyRebate);
	}
	public override double acceptCash(double money)
	{
		return money * moneyRebate;
	}
}
//返利收费子类
class CashReturn : CashSuper
{
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;
	//返利收费,初始化时必需输入返利条件和返利值,比如满300返100,则moneyCondition为300,moneyReturn为100
	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;
	}
}
//现金收费工厂类
class CashFactory
{
	public static CashSuper createCashAccept(string type)
	{
		CashSuper cs = null;
		switch(type)
		{
			case "正常收费":
				cs = new CashNormal;
				break;
			case "满300返100":
				CashReturn cr1 = new CashReturn("300", "100");
				cs = cr1;
				break;
			case "打8折":
				CashRebate cr2 = new CashRebate("0.8");
				cs = cr2;
				break;
		}
		return cs;
	}
}
//客户端程序主要部分
double total = 0.0d;
private void btnOk_Click(object sender, EventArgs e)
{
	CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());
	double totalPrices = 0d;
	totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
	total = total + totalPrices;
	lbxList.Items.Add("单价: " + txtPrices.Text + "数量: " + txtNum.Text + " " + cbxType.SelectedItem + " 合计: " + totalPrices.ToString());
	lbResult.Test = total.ToString();
}

仅策略模式:

//现金收费抽象类
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;
	//打折收费,初始化时,必需要输入折扣率,如八折,就是0.8
	public CashRebate(string moneyRebate)
	{
		this.moneyRebate = double.Parse(moneyRebate);
	}
	public override double acceptCash(double money)
	{
		return money * moneyRebate;
	}
}
//返利收费子类
class CashReturn : CashSuper
{
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;
	//返利收费,初始化时必需输入返利条件和返利值,比如满300返100,则moneyCondition为300,moneyReturn为100
	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;
	}
}
//CashContext类
class CashContext
{
	private CashSuper cs;
	public CashContext(CashSuper csuper)
	{
		this.cs = csuper;
	}
	public double GetResult(double money)
	{
		return cs.acceptCash;
	}
}
//客户端代码
double total = 0.0d;
private void btnOk_Click(object sender, EventArgs e)
{
	CashContext cc = null;
	switch (cbxType.SelectedItem.ToString())
	{
		case "正常收费":
			cc = new CashContext(new CashNormal());
			break;
		case "满300返100":
			cc = new CashContext(new CashReturn("300", "100"));
			break;
		case "打8折":
			cc = new CashContext(new CashRebate("0.8"));
			break;
	}
	
	
	double totalPrices = 0d;
	totalPrices = cc.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
	total = total + totalPrices;
	lbxList.Items.Add("单价: " + txtPrices.Text + "数量: " + txtNum.Text + " " + cbxType.SelectedItem + " 合计: " + totalPrices.ToString());
	lbResult.Test = total.ToString();
}

简单工厂+策略模式:

//现金收费抽象类
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;
	//打折收费,初始化时,必需要输入折扣率,如八折,就是0.8
	public CashRebate(string moneyRebate)
	{
		this.moneyRebate = double.Parse(moneyRebate);
	}
	public override double acceptCash(double money)
	{
		return money * moneyRebate;
	}
}
//返利收费子类
class CashReturn : CashSuper
{
	private double moneyCondition = 0.0d;
	private double moneyReturn = 0.0d;
	//返利收费,初始化时必需输入返利条件和返利值,比如满300返100,则moneyCondition为300,moneyReturn为100
	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;
	}
}
//CashContext类
class CashContext
{
	CashSuper cs = null;
	public CashContext(string type)
	{
		switch (type)
		{
			case "正常收费":
				CashNormal cs0 = new CashNormal();
				break;
			case "满300返100":
				CashReturn cr1 = new CashReturn("300", "100");
				break;
			case "打8折":
				CashRebate cr2 = new CashRebate("0.8");
				cs = cr2;
				break;
		}
	}
	public double GetResult(double money)
	{
		return cs.acceptCash;
	}
}
//客户端代码
double total = 0.0d;
private void btnOk_Click(object sender, EventArgs e)
{
	CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());
	double totalPrices = 0d;
	totalPrices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
	total = total + totalPrices;
	lbxList.Items.Add("单价: " + txtPrices.Text + "数量: " + txtNum.Text + " " + cbxType.SelectedItem + " 合计: " + totalPrices.ToString());
	lbResult.Test = total.ToString();
}

 

你可能感兴趣的:(设计模式)