分享
 
 
 

谈谈设计模式中的Iterator迭代器

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在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() throws Exception;

/**

* 提供一个可以遍历查询结果的对象,功能类似于java.util.List.iterator()

*

* @return DataListIterator 可以遍历查询结果的对象

* @throws Exception

*/

public DataListIterator iterator() throws Exception;

}

public interface DataListHandler{

/**

* 得到查询结果的一个子集

*

* @param startIndex 子集的起始位置

* @param count 子集的个数

* @return Datalist 返回一个子集

* @throws Exception

*/

public DataList getListChunk(int startIndex, int count) throws Exception;

/**

* 取得整个查询结果的大小,功能类似于java.util.List.size()

*

* @return size 查询结果的大小

* @throws Exception

*/

public int size() throws Exception;

/**

* 检查子集的前面是否还有查询结果

*

* @return boolean true表示前面还有查询结果

*/

public boolean hasPrevious();

/**

* 检查子集的后面是否还有查询结果

*

* @return boolean true表示后面还有查询结果

* @throws Exception

*/

public boolean hasNext() throws Exception;

/**

* 关闭对象

* @throws Exception

*/

public void close() throws Exception;

}

* @version 1.0

*

* Page实现了DataListHandler。

*

* 用于操作ResultSetDataList对象,对查询结果集进行分页显示。在进行显示的期间,必须

* 保持数据库连接Connection和结果集ResultSet没有关闭。

* 基本使用方法举例:

*

* int index = 4, count = 10;//显示第5到第14条记录

* Connection conn = Pool.getConnection();

* //(1)使用一个QueryDAO的具体子类来初始化页对象

* ResultSetQueryDAO dao = new ResultSetQueryDAO();

* ResultSetPage page = new ResultSetPage(conn, dao);

*

* //(2)或者直接使用一个ResultSet对象来初始化页对象

* //ResultSet rs = ...;

* //ResultSetPage page = new ResultSetPage(conn, rs);

*

* //需要显示的当前页chunk

* DataList chunk = page.getListChunk(index, count);

* //当前页的前后是否还有记录,用于显示PRVEIOUS和NEXT按钮

* boolean hasPrevious = page.hasPrevious();

* boolean hasNext = page.hasNext();

* //遍历显示当前页的记录

* DataListIterator it = chunk.iterator();

* while (it.hasNext())

* {

* String[] valuesOfRow = it.next();

* for(int i = 0; i

* System.out.println(valuesOfRow[i]);

* }

*

*

*

* @see QueryDAO

* @see DataListIterator

*/

import java.sql.*;

public class ResultSetPage implements DataListHandler{

private Connection conn = null;

private ResultSet rs = null;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有