`
381895649
  • 浏览: 227800 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 二

    博客分类:
  • java
阅读更多

 

上一篇文章: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>

 

 重构的小例子完成了....一个个类的源代码我就不贴出来,直接下载整个项目的源代码吧...

本文章来自:http://blog.mkfree.com/posts/31

  • 大小: 26.5 KB
  • 大小: 36.7 KB
0
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics