1. 程式人生 > >模板方法和介面引數的聯合使用 [ 同一請求,不同處理方式 ]

模板方法和介面引數的聯合使用 [ 同一請求,不同處理方式 ]

      在開發中,我們經常要進行網路請求,並且對返回的資料進行處理。但是不同的請求返回的資料不同,因此對資料的處理也不同。如何如何設計解析資料的型別或者方法成了一個難點。下面使用模板方法和介面引數來演示一下  : 

package com.umeng.dp.templatemethod;

/**
 * @Copyright: Umeng.com, Ltd. Copyright 2011-2015, All rights reserved
 * @Title: JdbcQueryTemplate.java
 * @Package com.umeng.dp.templatemethod
 * @Description: 這種設計可以用於網路請求中(以及類似場景),伺服器返回的不同資料進行不同的處理,比如json的解析、XML解析等
 * @author Honghui He
 * @version V1.0
 */

public class NetworkTemplate {

    public <T> T httpRequrst(String url, HttpHandler<T> handler) {
        // 新增請求引數
        addParams();
        // 常規情況下返回的是ResultSet,這裡模擬為String
        String result = doRequest(url);
        return handler.handle(result);
    }


    /**
     * @Title: getJdbcConnection
     * @Description: 獲取jdbc連線
     * @throws
     */
    private void addParams() {
        System.out.println("引數1");
        System.out.println("引數2");
        System.out.println("引數3");
        System.out.println("引數4");
    }

    /**
     * @Title: query
     * @Description: 假設返回的是符合條件的資料
     * @param sql
     * @return
     * @throws
     */
    private String doRequest(String url) {
        System.out.println("執行http請求,並且返回json資料");
        // 比如這裡返回json資料(模擬), 則要有不同的Handler來處理這些不同的資料型別或者是XML解析
        return "王老五 : 12000;";
    }


    /**
     * @ClassName: QueryHandler
     * @Description:
     *      查詢結果處理器
     * 
     * @author Honghui He  
     * @param <T>  處理以後的返回結果
     */
    public interface HttpHandler<T> {
        public T handle(String result);
    }
}

測試程式碼 : 

package com.umeng.dp.templatemethod;

import com.umeng.dp.templatemethod.NetworkTemplate.HttpHandler;

/**
 * @Copyright: Umeng.com, Ltd. Copyright 2011-2015, All rights reserved
 * @Title: Test.java
 * @Package com.umeng.dp.templatemethod
 * @Description:
 * @author Honghui He
 * @version V1.0
 */

public class Test {

    public static void main(String[] args) {

        // JDBC例子, 使用範型了的QueryHandler避免子類膨脹
        NetworkTemplate http = new NetworkTemplate();
        // 查詢存款超過10000的使用者
        http.httpRequrst("select * form userdb where money > 10000", new HttpHandler<Void>() {

            @Override
            public Void handle(String result) {
                String[] data = result.split(":");
                if (data.length > 0) {
                    System.out.println(data[0] + "有" + data[1]);
                }
                return null;
            }

        });
    }

}
輸出如下 : 

引數1
引數2
引數3
引數4
執行http請求,並且返回json資料
王老五 有 12000;