随笔-26  评论-111  文章-19  trackbacks-0
 

        数据分页显示是一项挺烦人的工作,涉及到数据来源,数据生成,数据显示这几个方面。数据有可能是从任意地方以任意方式获取到的,而且获取到的数据又有可能是经过了任意的方式处理之后,再以任意的方式显示给最终用户。

        这其中的一连串的“任意”就已经足够让人头疼了,我们现在要做的就是做出一个能一劳永逸的解决这一连串的问题的关于分页问题的设计。

        首先要明确的就是:这只是一个关于解决分页问题的设计思想,不会提供一份具体实现这个设计的代码。

         在开始之前,我们要先做一个假设:对数据分页的最终显示部分已经有具体的解决方案,并对其中的部分代码做一些改造,使其可以接受实现了IView接口的对象。

         一、我们需要如下的接口:

 

/**
 * 数据整理接口,
 * 将从数据来源中获取到的数据进行重新处理,
 * 得到一个新的数据集
 *
 *
 
*/

 
public interface IMakeUpRecord{
    
/**
     * 将从数据来源中获取到的数据进行重新处理,
      * 得到一个新的数据集
      * 
@param records 从数据来源中获取的初始数据
      
*/

     
public void do(String[][] records);
 }


 

/**
 * 与数据分页显示的具体实现部分的接口
 *
 *
 
*/

 
public interface IView{
    
/**
     * 设置HttpServletRequest
     *
     
*/

     
public void setRequest(HttpServletRequest request);

    
/**
     *  获取HttpServletRequest
     *
     
*/

     
public HttpServletRequest getRequest();

    
/**
     * 获取当前请求页码
      *
     
*/

     
public int getNowPage();

    
/**
     * 获取每一页需要显示多少条记录
      *
     
*/

     
public int getPageRow();

    
/**
     * 获取总记录条数
      *
     
*/
          
     
public int getCount();

     
/**
      * 根据当前页码和每一页需要显示的记录数获取当前页所有记录
       *
      *  
@param nowPage 当前页码
       *  
@param pageRow 每一页需要显示的记录数
       *
      *  
@return String[][] 
      *      当前页的所有记录,数组对应的是记录的行和列
       
*/

      
public String[][] getRecords(int nowPage,int pageRow);

      
/**
       * 将从数据来源中获取到的数据进行重新处理,得到一个新的数据集
        *
       * 
@param makeUpRecord数据整理接口
        * 
@param records从数据来源中获取的当前页的初始数据         
        *
       
*/

       
public void makeUpRecords(String[][] records);

       
/**
        * 在这个方法中进行所有方法的组合操作,返回给最终显示部分使用,
         * 返回的对象类型应该结合已经存在的具体的数据分页显示部分的代码 
         *
        
*/

        
public String createTable();

       
//其它方法
        ……

}

 

二、针对 IView 并结合已经存在的具体的数据分页显示部分的代码实现的一个抽象类

 

 

         public abstract class AbstractViewTemplate() implements IView{
                   
/**
                    * 设置HttpServletRequest
                    *
                    
*/

                   
public void setRequest(HttpServletRequest request){

                            
//具体实现

                   }


                   
/**
                    *  获取HttpServletRequest
                    *
                    
*/

                   
public HttpServletRequest getRequest(){

                            
//具体实现

                   }


                   
public IMakeUpRecord getMakeUpRecord(){

                            
//具体实现

                   }


                   
/**
                    * 获取当前请求页码
                    *
                    
*/

                   
public int getNowPage(){

                            
//具体实现

                   }


                   
/**
                     * 获取每一页需要显示多少条记录
                     *
                     
*/

                   
public int getPageRow(){

                            
//具体实现

                   }


                   
/**
                    * 获取总记录条数
                    * 由模板实现类进行具体的实现
                    *
                    
*/
          
                   
public abstract int getCount();

                   
/**
                    * 根据当前页码和每一页需要显示的记录数获取当前页所有记录
                    * 由模板实现类进行具体的实现
                    *
                    * 
@param nowPage 当前页码
                    * 
@param pageRow 每一页需要显示的记录数
                    *
                    * 
@return String[][] 
                    *      当前页的所有记录,数组对应的是记录的行和列
                    
*/

                   
public abstract String[][] getRecords(int nowPage,int pageRow);

                   
/**
                    * 将从数据来源中获取到的数据进行重新处理,得到一个新的数据集
                    *
                    * 
@param makeUpRecord数据整理接口
                    * 
@param records从数据来源中获取的当前页的初始数据         
                    *
                    
*/

                   
public void makeUpRecords(String[][] records){
                      IMakeUpRecord makeUpRecord
= getMakeUpRecord();
                      
if(makeUpRecord!=null)
                         makeUpRecord.
do(records);
                      }

                   }


                   
/**
                    * 在这个方法中进行所有方法的组合操作,返回给最终显示部分使用,
                    * 返回的对象类型应该结合已经存在的具体的数据分页显示部分的代码         
                    *
                    *
                    
*/

                   
public String createTable(){
                      
//其它操作
                      ……

                      String[][] records
= makeUpRecords(getRecords(getNowPage(),getPageRow()));
                      
                      
//其它操作
                      ……
                   }


                   
//其它方法
                   ……
         }

 

 

三、按照具体的数据来源方式实现AbstractViewTemplate抽象类

 

 

 1         public class viewTemplate extends AbstractViewTemplate{
 2                   /**
 3                    * 获取总记录条数
 4                    *
 5                    */
          
 6                   public int getCount(){
 7                       //具体实现,
 8                       //可以是通过数据库中获取数据总数,
 9                       //或从内存中获取数据总数,
10                       //或者从XML中获取数据总数
11                   }

12
13                   /**
14                    * 根据当前页码和每一页需要显示的记录数获取当前页所有记录
15                    *
16                    * @param nowPage 当前页码
17                    * @param pageRow 每一页需要显示的记录数
18                    *
19                    * @return String[][] 
20                    *      当前页的所有记录,数组对应的是记录的行和列
21                    */

22                   public String[][] getRecords(int nowPage,int pageRow)
23                            //具体实现,
24
25                            //可以是通过数据库中获取数据,jdbc方式,hibernate方式,或ibatis方式
26
27                            //或从内存中获取数据,数组或list或map
28
29                            //或者从XML中获取数据
30                   }

31
32          }

33

 

四、整体部分的结构如下所示

 

数显示部分的具体实现_3 à IView |à AbstractViewTemplate_3

数据显示部分的具体实现_2 à IView |à AbstractViewTemplate_2

数据显示部分的具体实现_1 à IView |à AbstractViewTemplate_1

数据显示部分的具体实现   à IView |à AbstractViewTemplate|àViewTemplate_3

                                                                                                       |à ViewTemplate_2

                                                                                                       |à ViewTemplate_1

                                                                                                       |à ViewTemplate

 

这样就通过策略模式和模板模式的结合,将数据显示、数据生成、数据来源三部分完全分开,并做到了重用和简化开发。

 

每种数据显示部分的具体实现,只需要实现一个针对其实现的AbstractViewTemplate抽象类即可。在之后的具体的业务开发过程中,关系的只是ViewTemplate部分中的两个方法, 只需要针对业务的具体需求,继承AbstractViewTemplate实现一个类似ViewTemplate的类即可。最终在AbstractViewTemplate中通过createTable()方法将展现所需要的数据传送给数据显示部分。

                                                                                                                             
                                                                                                                                        snoics

posted on 2008-03-25 11:39 snoics 阅读(2940) 评论(3)  编辑  收藏

评论:
# re: 一个关于分页的数据和显示完全分离的设计 2008-03-25 13:50 | HiMagic!
分的还不够彻底  回复  更多评论
  
# re: 一个关于分页的数据和显示完全分离的设计 2008-03-25 14:06 | Lancelot
数据就是数据,分页就是分页,显示就是显示。为什么非要混为一谈!!!

真正的分页就该是即使给你一个数组,你该能分页还是能分页!!!  回复  更多评论
  
# re: 一个关于分页的数据和显示分离的设计 2008-03-26 16:30 | 草包书生
我觉得效率上有点底哦。老大。/
不错我收藏起来  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问