隨筆-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 閱讀(2953) 評論(3)  編輯  收藏

          評論:
          # re: 一個關于分頁的數據和顯示完全分離的設計 2008-03-25 13:50 | HiMagic!
          分的還不夠徹底  回復  更多評論
            
          # re: 一個關于分頁的數據和顯示完全分離的設計 2008-03-25 14:06 | Lancelot
          數據就是數據,分頁就是分頁,顯示就是顯示。為什么非要混為一談?。。?

          真正的分頁就該是即使給你一個數組,你該能分頁還是能分頁?。?!  回復  更多評論
            
          # re: 一個關于分頁的數據和顯示分離的設計 2008-03-26 16:30 | 草包書生
          我覺得效率上有點底哦。老大。/
          不錯我收藏起來  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 广平县| 漠河县| 惠州市| 宝山区| 石台县| 连城县| 花垣县| 满洲里市| 长治县| 湄潭县| 昌乐县| 江陵县| 周宁县| 太谷县| 铜梁县| 太仆寺旗| 建德市| 阿拉善左旗| 镇康县| 临高县| 邓州市| 民勤县| 汤原县| 科尔| 武平县| 孟村| 长葛市| 织金县| 秀山| 页游| 连云港市| 永州市| 巨野县| 郓城县| 南昌市| 灵寿县| 乌鲁木齐市| 中阳县| 林口县| 仲巴县| 泗水县|