samtiger


          QQ:418148757
          Name:yangchuan
          數(shù)據(jù)加載中……
          設計模式之職責鏈模式

          設計模式之職責鏈 
           最近,在學習ajax的時候,發(fā)現(xiàn)了一個前后臺傳輸數(shù)據(jù)的好東東:json,通過json字符串我們能很快的將java對象轉(zhuǎn)換成javascript對象,至于json具體是什么東西,可以上他的官方網(wǎng)站去查看一下。這里簡單的介紹一下: json用一對大括號來表示一個對象,并用冒號隔開屬性和值,用逗號分隔多個屬性。表示數(shù)組對象的時候json用一對中括號表示。如下:
             1:json代碼來表示一個對象:   {"name":"楊川","sex":"男","age":26}.
               這就表示了一個人的對象。 它的屬性name = 楊川,性別=男 。年紀 =26歲。
             2:json表示數(shù)組: [1,2,3,{"name":"sam","sex":"man"}].
               這個就是一個數(shù)組,  其實熟悉javascript的人,都應該能看出來 json非常相似于javascript的直接量。比如數(shù)組直接量,對象直接量。
             恩,到這里我簡單介紹一下我要做的事情。是這樣的,我們的javascript可以通過一個eval函數(shù),將json字串轉(zhuǎn)化成它自己的對象,比如上邊的那個對象我們要穿換成 我們的 javascript對象就可以這樣寫
             jsonText = " {'name':'楊川','sex':'男','age':26}"
             var person = eval('('+jsonText+')');  //得到一個javascrip對象
             alert(person.name)  //提示: 楊川。
          所以,我們只要在java服務端將pojo生成一個個的json字符串,在前臺就可以 很簡單的轉(zhuǎn)換為js對象了。為前臺的數(shù)據(jù)使用提供了很大的方便 。
            因此我嘗試寫了這么一個轉(zhuǎn)換工具包,結(jié)果,在編寫的時候,發(fā)現(xiàn)職責鏈模式到時很適合這個。就拿來用了。呵呵,當然我下邊的 代碼不一定是唯一的,完善的,如果各位看客有更好的 思路和方法。還請賜教啊。
                好了,言歸正傳了。
            我對職責鏈的理解是這樣的,在處理某些業(yè)務的時候,我們可能會判斷不同的情況去選擇做不同的業(yè)務處理,這樣就可能導致大量的if else語句組出來。導致程序的擴展維護相當困難,就比如我這里轉(zhuǎn)換json的這個例子,我的一個tojson(Object object)函數(shù)。他里邊就要判斷這樣一些情況,如果是一個pojo則返回的字符串首尾加上一對大括號,如果是數(shù)組則首尾加上一對中括號。在處理數(shù)組的時候還要考慮數(shù)組元素是pojo,數(shù)組,集合或其它等情況,當然pojo的屬性對象,也得考慮它是否是一個基本數(shù)據(jù)類,pojo,數(shù)組或其它等情況。下邊看看我的代碼。

          public class JSONArray{
          @SuppressWarnings("unchecked")
           public static String toJson(Collection collection) {
            StringBuffer buffer = new StringBuffer();
            buffer.append("[");
            for (Object object : collection) {
             if (object instanceof Collection) {
              System.out.println(object.toString());
              JsonArray.toJson((Collection) object);
             } else {
              if (object.getClass().isArray()) {
               System.out.println(object.toString());
               JsonArray.toJson((Object[]) object);
              } else {
               if (buffer.length() > 1)
                buffer.append(",");
               buffer.append(JsonObject.toJson(object));
              }
             }
            }
            buffer.append("]");
            return buffer.toString();
           }

           @SuppressWarnings("unchecked")
           public static String toJson(Object[] collection) {

            StringBuffer buffer = new StringBuffer();
            buffer.append("[");
            for (Object object : collection) {
             if (object.getClass().isArray()) {
              System.out.println(object.toString());
              JsonArray.toJson((Object[]) object);
             } else {
              if (object instanceof Collection) {
               System.out.println(object.toString());
               JsonArray.toJson((Object[]) object);
              } else {
               if (buffer.length() > 1)
                buffer.append(",");
               buffer.append(JsonObject.toJson(object));
              }
             }

            }
            buffer.append("]");
            return buffer.toString();
           }

          }
          看看上邊 這段代碼,是不是很多if else語句,試想一下我如果再加入一個HashMap的處理方法進來,我
          是不是要 到上邊 每一個 方法都要加上這個類型的判斷處理呢?哪以后再加 呢 ??是不是很難維護了。
                 所以,這個地方我們就應該采用 職責鏈模式來完成這個處理。職責鏈模式會將不同類型的處理提出來單獨放在各自不同的類里去處理。當你傳入的數(shù)據(jù)類型時,它會依次在這些處理類里傳遞,直到找到該類型的處理類為止。

              好 ,先定義一個接口。如下:

          責任鏈接口
          這個例子我們需要把不同數(shù)據(jù)類型提出來做相應處理。簡單的可以分為,純 pojo對象的 處理,數(shù)組的處理,集合的處理:代碼如下:
          純對象的處理

          利用反射,讀出屬性和對應方法,并按json的格式輸出字符串,為了前臺方便轉(zhuǎn)換,這里注意了轉(zhuǎn)義字符的處理。

          2:處理集合類型:
          集合類型的處理
          3:數(shù)組的處理:
          數(shù)組的處理


          4: 責任鏈的 組裝
           1/*
           2* @(#)JSONClient.java
           3* createTime:Apr 22, 2008 8:41:10 AM
           4*/

           5package com.sam.jsontool.util;
           6
           7
           8/**
           9 * @author sam E-mail:ashan8888@163.com
          10 * @version 1.0
          11 */

          12public class JSONTool {
          13    
          14    private static JSONArray array ; 
          15    private static JSONCollection collection;
          16    private static JSONObject obj;
          17    static{
          18        array= new JSONArray(); 
          19        collection = new JSONCollection();
          20        obj = new JSONObject();
          21        collection.addChain(array);
          22        array.addChain(obj);
          23    }

          24    
          25    
          26    public static String toJSON(Object object){        
          27        String result = null;
          28        try {
          29            result = collection.doChain(object);
          30        }
           catch (JSONException e) {
          31            e.printStackTrace();        
          32        }

          33        return result;
          34    }

          35    
          36    
          37}

          38
          5:測認結(jié)果:
          簡單的單元測試

          呵呵,現(xiàn)在要是加入HashMap的類型處理 是不是很簡單了,只要加入一個類就可以了

          posted on 2008-04-24 19:45 sam.chuan.yang 閱讀(1322) 評論(0)  編輯  收藏 所屬分類: 23設計模式的理解


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 海兴县| 榕江县| 广水市| 海安县| 郧西县| 利川市| 新平| 台湾省| 格尔木市| 玉溪市| 翁源县| 奈曼旗| 兰州市| 七台河市| 新巴尔虎右旗| 调兵山市| 罗江县| 菏泽市| 石泉县| 富锦市| 太和县| 曲麻莱县| 乐清市| 张家界市| 灵武市| 阳原县| 苏尼特右旗| 东光县| 宁安市| 平湖市| 上栗县| 绍兴市| 顺义区| 耿马| 腾冲县| 新化县| 临邑县| 隆化县| 六盘水市| 许昌县| 阿鲁科尔沁旗|