今天主要学了策略模式,策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同方式调用所有的算法,减少了各种算法与使用算法类之间的耦合。一般在分析过程中只要遇到在不用的时间应用不同的业务都可以用该模式。其功能类似switch语句。结果工厂模式与策略模式实现了一个商场收费系统。
首先商场为了促销对不同的商品实行不同的收费模式,如打折、正常、满300,送100等,也就是说正常的价钱都要安装相应的收费模式经过相应算法才能得到最后的实际收费值。因此,一般的人就很容易想到面向过程的编程思维中的switch语句了,对于只有两三的收费模式也许可行,但是现在的问题是,由于市场竞争激烈,商场的收费模式会时常变化,那么每变一次,我们都要修改一次switch里面的语句了?要是增加一些新的模式呢?可想而知对于上百种的模式,只是修改一项就让程序员头疼了。现在我们换一种思维来考虑问题,不难发现,所有的收费模式其本质是一样的。都是输入正常的价钱,然后安装相应的算法返回应该收取的价钱。那么我们就可以想定义一个抽象类CashSuper,让后对于每一种收费算法我们都定义一个类,并且所有的算法类都继承CashSuper父类,通过重写GetCash()方法来实现具体的算法。这样一定义几个算法类的好处是:各个类之间相互不影响,而且以后有了新的算法,直接写一个继承CashSuer的类就行了,代码的改动就小了。对于怎样实例化这些算法的子类,我们可以定义一个CashContext上下文来实现具体的实例化,并且结合工厂模式CashContext类的主要实现如下:
{
CashSuper cash = null ;
public CashContext( string type)
{
switch (type)
{
case " 正常收费 " :
cash = new CashNamorl();
break ;
case " 打8折 " :
cash = new CashRebate ( " 0.8 " );
break ;
case " 满300,送100 " :
cash = new CashReturn( " 300 " , " 100 " );
break ;
}
}
public double GetCash( double money)
{
return cash.AcceptCash(money);
}
}
不过这样还是会有一个问题就是还是用到了switch,至于怎样解决这个问题,可以用反射(怎么实现目前还没学到那)
父类CashSuper的声明:
{
public abstract double AcceptCash( double money);
}
其他收费算法类声明(以“满300,送100”为例):
{
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;
throw new Exception( " The method or operation is not implemented. " );
}
整个源代码下载: /Files/LoveHong/Test2.zip