Welcome

首页 / 软件开发 / 数据结构与算法 / Java设计模式透析:组合(Composite)

Java设计模式透析:组合(Composite)2014-01-29 csdn guolin听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户 可以在其中随意选购自己喜欢的书籍。你们公司也是对此项目高度重视,加大了投入力度,决定给此 应用再增加点功能。

好吧,你也知道你是逃不过此劫了,没过多久你的leader就找到了你。 他告诉你目前的应用对每本书的浏览量和销售量做了统计,但现在想增加对每个书籍分类的浏览量和 销售量以及所有书籍总的浏览量和销售量做统计的功能,希望你可以来完成这项功能。

领导 安排的工作当然是推脱不掉的,你只能硬着头皮上了,不过好在这个功能看起来也不怎么复杂。

你比较喜欢看小说,那么就从小说类的统计功能开始做起吧。首先通过getAllNovels方法可 以获取到所有的小说名,然后将小说名传入getBrowseCount方法可以得到该书的浏览量,将小说名传 入getSaleCount方法可以得到该书的销售量。你目前只有这几个已知的API可以使用,那么开始动手 吧!

public int getNovelsBrowseCount() {int browseCount = 0;List<String> allNovels = getAllNovels();for (String novel : allNovels) {browseCount += getBrowseCount(novel);}return browseCount;}public int getNovelsSaleCount() {int saleCount = 0;List<String> allNovels = getAllNovels();for (String novel : allNovels) {saleCount += getSaleCount(novel);}return saleCount;}
很快你就写下了以上两个方法,这两个方法都是通过获取到所有的小说名,然后一一计算 每本小说的浏览量和销售量,最后将结果相加得到总量。

小说类的统计就完成了,然后你开 始做计算机类书籍的统计功能,代码如下所示:

public int getComputerBooksBrowseCount() {int browseCount = 0;List<String> allComputerBooks = getAllComputerBooks();for (String computerBook : allComputerBooks) {browseCount += getBrowseCount(computerBook);}return browseCount;}public int getComputerBooksSaleCount() {int saleCount = 0;List<String> allComputerBooks = getAllComputerBooks();for (String computerBook : allComputerBooks) {saleCount += getSaleCount(computerBook);}return saleCount;}
除了使用了getAllComputerBooks方法获取到所有的计算机类书名,其它的代码基本和小 说统计中的是一样的。

现在你才完成了两类书籍的统计功能,后面还有医学类、自然类、历 史类、法律类、政治类、哲学类、旅游类、美食类等等等等书籍。你突然意识到了一些问题的严重性 ,工作量大倒还不算什么,但再这么写下去,你的方法就要爆炸了,这么多的方法让人看都看不过来 ,别提怎么使用了。

这个时候你只好向你的leader求助了,跟他说明了你的困惑。只见你的 leader思考了片刻,然后自信地告诉你,使用组合模式不仅可以轻松消除你的困惑,还能出色地完成 功能。

他立刻向你秀起了编码操作,首先定义一个Statistics接口,里面有两个待实现方法 :

public interface Statistics {int getBrowseCount();int getSalesCount();}
然后定义一个用于统计小说类书籍的NovelStatistics类,实现接口中定义的两个方法:

public class NovelStatistics implements Statistics {@Overridepublic int getBrowseCount() {int browseCount = 0;List<String> allNovels = getAllNovels();for (String novel : allNovels) {browseCount += getBrowseCount(novel);}return browseCount;}@Overridepublic int getSalesCount() {int saleCount = 0;List<String> allNovels = getAllNovels();for (String novel : allNovels) {saleCount += getSaleCount(novel);}return saleCount;}}