samtiger


QQ:418148757
Name:yangchuan
数据加载中……
设计模式之职责链模式

设计模式之职责链 
 最近,在学习ajax的时候,发现了一个前后台传输数据的好东东:json,通过json字符串我们能很快的将java对象转换成javascript对象,至于json具体是什么东西,可以上他的官方网站去查看一下。这里简单的介绍一下: json用一对大括号来表示一个对象,并用冒号隔开属性和值,用逗号分隔多个属性。表示数组对象的时候json用一对中括号表示。如下:
   1:json代码来表示一个对象:   {"name":"杨川","sex":"男","age":26}.
     这就表示了一个人的对象。 它的属性name = 杨川,性别=男 。年纪 =26岁。
   2:json表示数组: [1,2,3,{"name":"sam","sex":"man"}].
     这个就是一个数组,  其实熟悉javascript的人,都应该能看出来 json非常相似于javascript的直接量。比如数组直接量,对象直接量。
   恩,到这里我简单介绍一下我要做的事情。是这样的,我们的javascript可以通过一个eval函数,将json字串转化成它自己的对象,比如上边的那个对象我们要穿换成 我们的 javascript对象就可以这样写
   jsonText = " {'name':'杨川','sex':'男','age':26}"
   var person = eval('('+jsonText+')');  //得到一个javascrip对象
   alert(person.name)  //提示: 杨川。
所以,我们只要在java服务端将pojo生成一个个的json字符串,在前台就可以 很简单的转换为js对象了。为前台的数据使用提供了很大的方便 。
  因此我尝试写了这么一个转换工具包,结果,在编写的时候,发现职责链模式到时很适合这个。就拿来用了。呵呵,当然我下边的 代码不一定是唯一的,完善的,如果各位看客有更好的 思路和方法。还请赐教啊。
      好了,言归正传了。
  我对职责链的理解是这样的,在处理某些业务的时候,我们可能会判断不同的情况去选择做不同的业务处理,这样就可能导致大量的if else语句组出来。导致程序的扩展维护相当困难,就比如我这里转换json的这个例子,我的一个tojson(Object object)函数。他里边就要判断这样一些情况,如果是一个pojo则返回的字符串首尾加上一对大括号,如果是数组则首尾加上一对中括号。在处理数组的时候还要考虑数组元素是pojo,数组,集合或其它等情况,当然pojo的属性对象,也得考虑它是否是一个基本数据类,pojo,数组或其它等情况。下边看看我的代码。

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的处理方法进来,我
是不是要 到上边 每一个 方法都要加上这个类型的判断处理呢?哪以后再加 呢 ??是不是很难维护了。
       所以,这个地方我们就应该采用 职责链模式来完成这个处理。职责链模式会将不同类型的处理提出来单独放在各自不同的类里去处理。当你传入的数据类型时,它会依次在这些处理类里传递,直到找到该类型的处理类为止。

    好 ,先定义一个接口。如下:

责任链接口
这个例子我们需要把不同数据类型提出来做相应处理。简单的可以分为,纯 pojo对象的 处理,数组的处理,集合的处理:代码如下:
纯对象的处理

利用反射,读出属性和对应方法,并按json的格式输出字符串,为了前台方便转换,这里注意了转义字符的处理。

2:处理集合类型:
集合类型的处理
3:数组的处理:
数组的处理


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:测认结果:
简单的单元测试

呵呵,现在要是加入HashMap的类型处理 是不是很简单了,只要加入一个类就可以了

posted on 2008-04-24 19:45 sam.chuan.yang 阅读(1312) 评论(0)  编辑  收藏 所属分类: 23设计模式的理解


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


网站导航: