time 
设为首页】【收藏本站
当前位置: 主页 > JAVA > Java高级 > 设计模式 > Java设计模式分析之组合(Composite)

Java设计模式分析之组合(Composite)

时间:2014-06-18 15:30 点击:4091次 字体:[ ]




听说你们公司最近新推出了一款电子书阅读应用,市场反应很不错,应用里还有图书商城,用户可以在其中随意选购自己喜欢的书籍。你们公司也是对此项目高度重视,加大了投入力度,决定给此应用再增加点功能。

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

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

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

  1. public int getNovelsBrowseCount() {  
  2.     int browseCount = 0;  
  3.     List<String> allNovels = getAllNovels();  
  4.     for (String novel : allNovels) {  
  5.         browseCount += getBrowseCount(novel);  
  6.     }  
  7.     return browseCount;  
  8. }  
  9.  
  10. public int getNovelsSaleCount() {  
  11.     int saleCount = 0;  
  12.     List<String> allNovels = getAllNovels();  
  13.     for (String novel : allNovels) {  
  14.         saleCount += getSaleCount(novel);  
  15.     }  
  16.     return saleCount;  
  17. }  

很快你就写下了以上两个方法,这两个方法都是通过获取到所有的小说名,然后一一计算每本小说的浏览量和销售量,最后将结果相加得到总量。

 

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

  1. public int getComputerBooksBrowseCount() {  
  2.     int browseCount = 0;  
  3.     List<String> allComputerBooks = getAllComputerBooks();  
  4.     for (String computerBook : allComputerBooks) {  
  5.         browseCount += getBrowseCount(computerBook);  
  6.     }  
  7.     return browseCount;  
  8. }  
  9.  
  10. public int getComputerBooksSaleCount() {  
  11.     int saleCount = 0;  
  12.     List<String> allComputerBooks = getAllComputerBooks();  
  13.     for (String computerBook : allComputerBooks) {  
  14.         saleCount += getSaleCount(computerBook);  
  15.     }  
  16.     return saleCount;  
  17. }  

除了使用了getAllComputerBooks方法获取到所有的计算机类书名,其它的代码基本和小说统计中的是一样的。

 

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

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

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

  1. public interface Statistics {  
  2.  
  3.     int getBrowseCount();  
  4.       
  5.     int getSalesCount();  
  6.  
  7. }  

然后定义一个用于统计小说类书籍的NovelStatistics类,实现接口中定义的两个方法:

  1. public class NovelStatistics implements Statistics {  
  2.  
  3.     @Override 
  4.     public int getBrowseCount() {  
  5.         int browseCount = 0;  
  6.         List<String> allNovels = getAllNovels();  
  7.         for (String novel : allNovels) {  
  8.             browseCount += getBrowseCount(novel);  
  9.         }  
  10.         return browseCount;  
  11.     }  
  12.  
  13.     @Override 
  14.     public int getSalesCount() {  
  15.         int saleCount = 0;  
  16.         List<String> allNovels = getAllNovels();  
  17.         for (String novel : allNovels) {  
  18.             saleCount += getSaleCount(novel);  
  19.         }  
  20.         return saleCount;  
  21.     }  
  22.  
  23. }  

在这两个方法中分别统计了小说类书籍的浏览量和销售量。那么同样的方法,你的leader又定义了一个ComputerBookStatistics类用于统计计算机类书籍的浏览量和销售量:

  1. public class ComputerBookStatistics implements Statistics {  
  2.  
  3.     @Override 
  4.     public int getBrowseCount() {  
  5.         int browseCount = 0;  
  6.         List<String> allComputerBooks = getAllComputerBooks();  
  7.         for (String computerBook : allComputerBooks) {  
  8.             browseCount += getBrowseCount(computerBook);  
  9.         }  
  10.         return browseCount;  
  11.     }  
  12.  
  13.     @Override 
  14.     public int getSalesCount() {  
  15.         int saleCount = 0;  
  16.         List<String> allComputerBooks = getAllComputerBooks();  
  17.         for (String computerBook : allComputerBooks) {  
  18.             saleCount += getSaleCount(computerBook);  
  19.         }  
  20.         return saleCount;  
  21.     }  
  22.  
  23. }  

这样将具体的统计实现分散在各个类中,就不会再出现你刚刚那种方法爆炸的情况了。不过这还没开始真正使用组合模式呢,好戏还在后头,你的leader吹嘘道。



本文地址 : http://www.fengfly.com/plus/view-215096-1.html
标签: java 设计模式 Composite 组合
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:
本栏分类