上一篇文章:java 代码重构-第一章(使用策略模式,把恶心的 switch代码去掉...) 一
下一篇文章:java 代码重构-第一章(结语...目录,源代码下载)
上一篇文章,没有把switch代码去掉,现在再继续去做..这里正式运用策略模式
我的作法是一次取出一个case 分支,在相应的class内建立一个覆写函数(overriding method)。先从 RegularPrice 开始:
RegularPrice
/**
* 获取普通电影收费
*
* @param daysRented
* @return
*/
double getCharge(int daysRented) {
double result = 2;
if (daysRented > 2)
result += (daysRented - 2) * 1.5;
return result;
}
ChildrensPrice
/**
* 获取儿童电影的收费
*
* @param daysRented
* @return
*/
double getCharge(int daysRented) {
double result = 1.5;
if (daysRented > 3)
result += (daysRented - 3) * 1.5;
return result;
}
NewReleasePrice
/**
* 获取新发布电影收费
*
* @param daysRented
* @return
*/
double getCharge(int daysRented) {
return daysRented * 3;
}
处理完所有case 分支之后,我就把Price.getCharge() 声明为abstract。
class Price...
abstract double getCharge(int daysRented);
Price
price {...
/**
* 获取经常的租赁
*
* @param daysRented
* @return
*/
int getFrequentRenterPoints(int daysRented) {
if ((getPriceCode() == Movie.NEW_RELEASE) && daysRented > 1)
return 2;
else
return 1;
}
}
但是这一次我不把superclass 函数声明为abstract。我只是为「新片类型」产生一个覆写函数(overriding method ),并在superclass 内留下一个已定义的函数,使它成为一种缺省行为。
NewReleasePrice
NewReleasePrice{...
/**
* 获取新发布电影经常的租赁
*
* @param daysRented
* @return
*/
int getFrequentRenterPoints(int daysRented) {
return (daysRented > 1) ? 2 : 1;
}
}
Price
Price{...
/**
* 获取经常的租赁
*
* @param daysRented
* @return
*/
int getFrequentRenterPoints(int daysRented) {
return 1;
}
}
引入State 模式花了我不少力气,值得吗?这么做的收获是:如果我要修改任何与价格有关的行为,或是添加新的定价标准,或是加 入其他取决于价格的行为,程序的修改会容易得多。这个程序的其余部分并不知道我运用了State 模式。对于我目前拥有的这么几个小量行为来说,任何功能或特性上的修改也许都称不上什么困难,但如果在一个更复杂 的系统中,有十多个与价格相关的函数,程序的修改难易度就会有很大的区别。以上所有修改都是小步骤进行,进度似乎 太过缓慢,但是没有任何一次我需要打开调试器(debugger),所以整个过程实际上很快就过去了。
现在我已经完成了第二个重要的重构行为。从此,修改「影片分类结构」,或是改变「费用计算规则」、改变常 客积点计算规则,都容易多了。图1.16和图1.17描述State 模式对于价格信息所起的作用。
下面是运行结果...成功重构...开心吧...好了,跟女朋友玩去...
Rental Record for oyhk
少林足球 6.0
大话西游 1.5
一路向西 2.0
Amount owed is 9.5
You earned 4 frequent renter points
------------------------------------------------
<H1>Rentals for <EM>oyhk</EM></ H1><P>
少林足球: 6.0<BR>
大话西游: 1.5<BR>
一路向西: 2.0<BR>
<P>You owe <EM>9.5</EM><P>
On this rental you earned <EM>4</EM> frequent renter points<P>
重构的小例子完成了....一个个类的源代码我就不贴出来,直接下载整个项目的源代码吧...