岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Java >> 高级技术 >> 设计模式 >> Java正文
谈谈设计模式中的Iterator迭代器
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-7-22 17:49:29

  在Pet Store中的CatalogDao使用了DAO模式,从而完成Fast-Lane Reader模式,以便能快速的输出数据库元素
  
  列表,同时使用for page-by-page iteration完成每页的输出显示。
  
  在CatalogDAOImpl 中基本返回的是Page,也就是说,在CatalogDAOImpl的具体JDBC数据库查询时,就将Page功
  
  能融入其中,从而一步到位的完成输出显示。
  
  但在实际系统应用中,我们都有用户权限约束,也就是说,并不是每条数据库记录都能被显示输出,有些用户
  
  就只能看到他被授权看到的的记录。
  
  Jive中的Iterator模式就很好的解决了这个问题,Jive中使用Proxy模式完成用户权限级别的验证,同时为了更
  
  快的获得数据库记录和节约内存,Jive专门建立了自己的Iterator模式,这些一开始让人疑惑,直接使用
  
  Collection的Iterator不是更好,虽然简单方便了,但是前提是在内存中要先开辟一块Collection内存,如果
  
  数据库记录很大,将耗费很多内存,致使系统瘫痪(细节讨论见
  http://www.jdon.com:81/jive/thread.jsp?forum=16&thread=302)
  
  Jive的Iterator不只是传递了数据库指针,而且加载了权限验证功能,因此,这一模式是实用可行的,那么在
  
  我们自己的EJB应用中如何综合这两个系统的模式优点?
  
  这其中应该有很多中间方案可行,如果你有兴趣可以贴出你的想法,我目前采取的是DAO模式和Jive的Iterator
  
  模式集合,也就是说,在自己的EJB中不直接返回Page 而是返回Iterator,这个Iterator是类似Jive中的
  
  DatabaseObjectIterator。
  
  简单的说,由于Jive不是EJB架构,所以,将Jive中的访问数据库段用DAO模式替代,其他都可以照搬Jive的
  
  Iterator模式,关于前端JSP页面的分页输出,这时可以参考Pet Store的page-by-page iteration模式,也就
  
  是说,根据Iterator模式再拓展写Page,结构和功能类似Pet store的Page.
  
  这里只提供一个大体思路,如果要写透彻真是很长,看看平常我们以前用ASP PHP做的数据库查询分页的简单功
  
  能蕴含这么多新的思想,其实这些思想也是在ASP PHP应付大数据库量失败的总结,所以软件质量控制是显得多
  
  么重要。
  
  
  
  我用Iterator的程序代码:
  public interface DataListIterator
  {
  /**
  * 功能类似于java.util.Iterator.hasNext()
  *
  * @return 如果有下一个元素,返回true
  * @throws Exception
  */
  public boolean hasNext() throws Exception;
  
  /**
  * 功能类似于java.util.Iterator.next(),但是返回的是数据库查询的结果
  * 的字段值字符串数组。
  *
  * @return String[] 字段值字符串数组
  * @throws Exception
  */
  public String[] next() throws Exception;
  }
  
  
  
  public interface DataList{
  
  /**
  * 取出指定位置查询结果中的字段值,放到一个字符串数组中并返回。
  * 功能类似于java.util.List.get(int)
  *
  * @param index 查询结果的索引
  * @return String[] 结果中的字段值数组
  *
  * @throws Exception
  */
  public String[] get(int index) throws Exception;
  
  /**
  * 检查查询结果的集和是否为空集合
  *
  * @return boolean true表示空集合
  * @throws Exception
  */
  public boolean isEmpty() throws Exception;
  
  /**
  * 检查是否还有下一个查询结果
  *
  * @return boolean true表示有下一个
  * @throws Exception
  */
  public boolean hasNext() throws Exception;
  
  /**
  * 检查在指定位置上是否有查询结果
  *
  * @param index 查询结果的索引
  * @return boolean true表示有查询结果
  * @throws Exception
  */
  public boolean isElementExist(int index) throws Exception;
  
  /**
  * 把游标放到指定的位置上,功能类似于java.sql.ResultSet.absolute(int)
  *
  * @param index 指定的位置,从0开始
  * @return boolean true表示操作成功
  * @throws Exception
  */
  public boolean absolute(int index) throws Exception;
  
  /**
  * 把游标放到查询结果的最前面,功能类似于java.sql.ResultSet.beforeFirst()
  *
  * @throws Exception
  */
  public void beforeFirst() throws Exception;
  
  /**
  * 把游标放到查询结果的第一个,功能类似于java.sql.ResultSet.first()
  *
  * @return boolean true表示移动成功
  * @throws Exception
  */
  public boolean first() throws Exception;
  
  /**
  * 把游标放到查询结果的最后一个,功能类似于java.sql.ResultSet.last()
  *
  * @return boolean true表示移动成功
  * @throws Exception
  */
  public boolean last() throws Exception;
  
  /**
  * 取得整个查询结果的大小,功能类似于java.util.List.size()
  *
  * @return size 查询结果的大小
  * @throws Exception
  */
  public int size()

[1] [2] 下一页


  • 上一个Java:
  • 下一个Java:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    传世私服 传奇世界私服 天龙八部私服 bet365 传世私服 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365