<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-26  評論-111  文章-19  trackbacks-0
     

            數(shù)據(jù)分頁顯示是一項(xiàng)挺煩人的工作,涉及到數(shù)據(jù)來源,數(shù)據(jù)生成,數(shù)據(jù)顯示這幾個(gè)方面。數(shù)據(jù)有可能是從任意地方以任意方式獲取到的,而且獲取到的數(shù)據(jù)又有可能是經(jīng)過了任意的方式處理之后,再以任意的方式顯示給最終用戶。

            這其中的一連串的“任意”就已經(jīng)足夠讓人頭疼了,我們現(xiàn)在要做的就是做出一個(gè)能一勞永逸的解決這一連串的問題的關(guān)于分頁問題的設(shè)計(jì)。

            首先要明確的就是:這只是一個(gè)關(guān)于解決分頁問題的設(shè)計(jì)思想,不會提供一份具體實(shí)現(xiàn)這個(gè)設(shè)計(jì)的代碼。

             在開始之前,我們要先做一個(gè)假設(shè):對數(shù)據(jù)分頁的最終顯示部分已經(jīng)有具體的解決方案,并對其中的部分代碼做一些改造,使其可以接受實(shí)現(xiàn)了IView接口的對象。

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

     

    /**
     * 數(shù)據(jù)整理接口,
     * 將從數(shù)據(jù)來源中獲取到的數(shù)據(jù)進(jìn)行重新處理,
     * 得到一個(gè)新的數(shù)據(jù)集
     *
     *
     
    */

     
    public interface IMakeUpRecord{
        
    /**
         * 將從數(shù)據(jù)來源中獲取到的數(shù)據(jù)進(jìn)行重新處理,
          * 得到一個(gè)新的數(shù)據(jù)集
          * 
    @param records 從數(shù)據(jù)來源中獲取的初始數(shù)據(jù)
          
    */

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


     

    /**
     * 與數(shù)據(jù)分頁顯示的具體實(shí)現(xiàn)部分的接口
     *
     *
     
    */

     
    public interface IView{
        
    /**
         * 設(shè)置HttpServletRequest
         *
         
    */

         
    public void setRequest(HttpServletRequest request);

        
    /**
         *  獲取HttpServletRequest
         *
         
    */

         
    public HttpServletRequest getRequest();

        
    /**
         * 獲取當(dāng)前請求頁碼
          *
         
    */

         
    public int getNowPage();

        
    /**
         * 獲取每一頁需要顯示多少條記錄
          *
         
    */

         
    public int getPageRow();

        
    /**
         * 獲取總記錄條數(shù)
          *
         
    */
              
         
    public int getCount();

         
    /**
          * 根據(jù)當(dāng)前頁碼和每一頁需要顯示的記錄數(shù)獲取當(dāng)前頁所有記錄
           *
          *  
    @param nowPage 當(dāng)前頁碼
           *  
    @param pageRow 每一頁需要顯示的記錄數(shù)
           *
          *  
    @return String[][] 
          *      當(dāng)前頁的所有記錄,數(shù)組對應(yīng)的是記錄的行和列
           
    */

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

          
    /**
           * 將從數(shù)據(jù)來源中獲取到的數(shù)據(jù)進(jìn)行重新處理,得到一個(gè)新的數(shù)據(jù)集
            *
           * 
    @param makeUpRecord數(shù)據(jù)整理接口
            * 
    @param records從數(shù)據(jù)來源中獲取的當(dāng)前頁的初始數(shù)據(jù)         
            *
           
    */

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

           
    /**
            * 在這個(gè)方法中進(jìn)行所有方法的組合操作,返回給最終顯示部分使用,
             * 返回的對象類型應(yīng)該結(jié)合已經(jīng)存在的具體的數(shù)據(jù)分頁顯示部分的代碼 
             *
            
    */

            
    public String createTable();

           
    //其它方法
            ……

    }

     

    二、針對 IView 并結(jié)合已經(jīng)存在的具體的數(shù)據(jù)分頁顯示部分的代碼實(shí)現(xiàn)的一個(gè)抽象類

     

     

             public abstract class AbstractViewTemplate() implements IView{
                       
    /**
                        * 設(shè)置HttpServletRequest
                        *
                        
    */

                       
    public void setRequest(HttpServletRequest request){

                                
    //具體實(shí)現(xiàn)

                       }


                       
    /**
                        *  獲取HttpServletRequest
                        *
                        
    */

                       
    public HttpServletRequest getRequest(){

                                
    //具體實(shí)現(xiàn)

                       }


                       
    public IMakeUpRecord getMakeUpRecord(){

                                
    //具體實(shí)現(xiàn)

                       }


                       
    /**
                        * 獲取當(dāng)前請求頁碼
                        *
                        
    */

                       
    public int getNowPage(){

                                
    //具體實(shí)現(xiàn)

                       }


                       
    /**
                         * 獲取每一頁需要顯示多少條記錄
                         *
                         
    */

                       
    public int getPageRow(){

                                
    //具體實(shí)現(xiàn)

                       }


                       
    /**
                        * 獲取總記錄條數(shù)
                        * 由模板實(shí)現(xiàn)類進(jìn)行具體的實(shí)現(xiàn)
                        *
                        
    */
              
                       
    public abstract int getCount();

                       
    /**
                        * 根據(jù)當(dāng)前頁碼和每一頁需要顯示的記錄數(shù)獲取當(dāng)前頁所有記錄
                        * 由模板實(shí)現(xiàn)類進(jìn)行具體的實(shí)現(xiàn)
                        *
                        * 
    @param nowPage 當(dāng)前頁碼
                        * 
    @param pageRow 每一頁需要顯示的記錄數(shù)
                        *
                        * 
    @return String[][] 
                        *      當(dāng)前頁的所有記錄,數(shù)組對應(yīng)的是記錄的行和列
                        
    */

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

                       
    /**
                        * 將從數(shù)據(jù)來源中獲取到的數(shù)據(jù)進(jìn)行重新處理,得到一個(gè)新的數(shù)據(jù)集
                        *
                        * 
    @param makeUpRecord數(shù)據(jù)整理接口
                        * 
    @param records從數(shù)據(jù)來源中獲取的當(dāng)前頁的初始數(shù)據(jù)         
                        *
                        
    */

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

                       }


                       
    /**
                        * 在這個(gè)方法中進(jìn)行所有方法的組合操作,返回給最終顯示部分使用,
                        * 返回的對象類型應(yīng)該結(jié)合已經(jīng)存在的具體的數(shù)據(jù)分頁顯示部分的代碼         
                        *
                        *
                        
    */

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

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


                       
    //其它方法
                       ……
             }

     

     

    三、按照具體的數(shù)據(jù)來源方式實(shí)現(xiàn)AbstractViewTemplate抽象類

     

     

     1         public class viewTemplate extends AbstractViewTemplate{
     2                   /**
     3                    * 獲取總記錄條數(shù)
     4                    *
     5                    */
              
     6                   public int getCount(){
     7                       //具體實(shí)現(xiàn),
     8                       //可以是通過數(shù)據(jù)庫中獲取數(shù)據(jù)總數(shù),
     9                       //或從內(nèi)存中獲取數(shù)據(jù)總數(shù),
    10                       //或者從XML中獲取數(shù)據(jù)總數(shù)
    11                   }

    12
    13                   /**
    14                    * 根據(jù)當(dāng)前頁碼和每一頁需要顯示的記錄數(shù)獲取當(dāng)前頁所有記錄
    15                    *
    16                    * @param nowPage 當(dāng)前頁碼
    17                    * @param pageRow 每一頁需要顯示的記錄數(shù)
    18                    *
    19                    * @return String[][] 
    20                    *      當(dāng)前頁的所有記錄,數(shù)組對應(yīng)的是記錄的行和列
    21                    */

    22                   public String[][] getRecords(int nowPage,int pageRow)
    23                            //具體實(shí)現(xiàn),
    24
    25                            //可以是通過數(shù)據(jù)庫中獲取數(shù)據(jù),jdbc方式,hibernate方式,或ibatis方式
    26
    27                            //或從內(nèi)存中獲取數(shù)據(jù),數(shù)組或list或map
    28
    29                            //或者從XML中獲取數(shù)據(jù)
    30                   }

    31
    32          }

    33

     

    四、整體部分的結(jié)構(gòu)如下所示

     

    數(shù)顯示部分的具體實(shí)現(xiàn)_3 à IView |à AbstractViewTemplate_3

    數(shù)據(jù)顯示部分的具體實(shí)現(xiàn)_2 à IView |à AbstractViewTemplate_2

    數(shù)據(jù)顯示部分的具體實(shí)現(xiàn)_1 à IView |à AbstractViewTemplate_1

    數(shù)據(jù)顯示部分的具體實(shí)現(xiàn)   à IView |à AbstractViewTemplate|àViewTemplate_3

                                                                                                           |à ViewTemplate_2

                                                                                                           |à ViewTemplate_1

                                                                                                           |à ViewTemplate

     

    這樣就通過策略模式和模板模式的結(jié)合,將數(shù)據(jù)顯示、數(shù)據(jù)生成、數(shù)據(jù)來源三部分完全分開,并做到了重用和簡化開發(fā)。

     

    每種數(shù)據(jù)顯示部分的具體實(shí)現(xiàn),只需要實(shí)現(xiàn)一個(gè)針對其實(shí)現(xiàn)的AbstractViewTemplate抽象類即可。在之后的具體的業(yè)務(wù)開發(fā)過程中,關(guān)系的只是ViewTemplate部分中的兩個(gè)方法, 只需要針對業(yè)務(wù)的具體需求,繼承AbstractViewTemplate實(shí)現(xiàn)一個(gè)類似ViewTemplate的類即可。最終在AbstractViewTemplate中通過createTable()方法將展現(xiàn)所需要的數(shù)據(jù)傳送給數(shù)據(jù)顯示部分。

                                                                                                                                 
                                                                                                                                            snoics

    posted on 2008-03-25 11:39 snoics 閱讀(2949) 評論(3)  編輯  收藏

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

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

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


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 免费国产成人午夜在线观看| 亚洲精品无码成人片久久不卡| 久久久久亚洲精品天堂久久久久久 | 白白国产永久免费视频| 在线免费视频一区二区| 亚洲国产一区二区三区| 午夜亚洲AV日韩AV无码大全| 亚洲国产日韩在线成人蜜芽 | 久草免费福利在线| 毛片无码免费无码播放| 在线免费观看国产视频| 亚洲avav天堂av在线不卡| 久久精品无码专区免费青青| 国产免费久久精品久久久| 亚洲一区二区三区电影| 亚洲AV成人精品日韩一区| 男女午夜24式免费视频| 国产一级做a爱免费视频| 美女被爆羞羞网站在免费观看| 久久成人无码国产免费播放| 亚洲人成网站在线播放影院在线| 女人裸身j部免费视频无遮挡| 国产成人免费午夜在线观看| 女人18毛片水真多免费播放| 日韩精品亚洲专区在线影视| 天天操夜夜操免费视频| 国产精品亚洲а∨天堂2021| 97无码免费人妻超级碰碰夜夜| 亚洲AV无码久久精品成人| 看Aⅴ免费毛片手机播放| 伊人久久亚洲综合| 一级女性全黄久久生活片免费| 无码少妇一区二区浪潮免费| 在线观看亚洲一区二区| 青柠影视在线观看免费| 亚洲日韩精品无码专区网站| 偷自拍亚洲视频在线观看99| 亚洲av无码专区在线播放| 国内一级一级毛片a免费| 国产免费人成视频在线播放播| 亚洲天堂一区二区三区|