API須要同時維護多個版本。如何優雅的設計?

在項目中常常遇到,相同的數據,對不一樣的客戶以及不一樣的終端,須要輸出不一樣的數據。java

更有特殊的狀況,須要對一個數據,在不一樣的終端表示形式不同。綜合多種考慮,須要一種支持擴展,而且靈活的的接口, 開發效率還需高效。android

在網上找了一圈沒有發現,決定本身實現一個,決定使用模板,在freeMark和Velocity之間擇了Velocity 。apache

  1. 性能json

  2. 夠用api

原理,app

利用Velocity的功能,生成各類複雜的數據,再向經過接口統一輸出函數

直接上代碼截圖性能

接口模板this

package com.echo.api.velocity.inter;

import org.apache.velocity.VelocityContext;

/**
 * 適配器接口. <br>
 * 類詳細說明.
 * <p>
 * Copyright: Copyright (c) 2015年9月9日 下午4:02:23
 * <p>
 * <p>
 * 
 * @version 1.0.0
 */
public interface IDataAdapter {

	String TYPE_JSON = "json";

	String TYPE_XML = "xml";

	/**
	 * @param type
	 *            報文類型,json,xml
	 * @param version
	 *            版本,1.0.0
	 * @param key
	 *            標示key能夠是任意指定
	 * @param template
	 *            報文模板名稱
	 * @return
	 */
	public String getResult(String type, String version, String key, String template, VelocityContext context);
}

 

package com.echo.api.velocity.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.StringWriter;
import java.util.Properties;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;

import com.echo.api.velocity.inter.IDataAdapter;

/**
 * 常見的數據
 * <p>
 * Copyright: Copyright (c) 2015年9月9日 下午4:13:42
 * <p>
 * 
 * @version 1.0.0
 */
public class GeneralDataAdapter implements IDataAdapter {

	/**
	 * 模板基礎路徑
	 */
	private String baseTemplatePath;

	private VelocityEngine velocityEngine;

	private String encoding = "utf-8";

	public GeneralDataAdapter() throws Exception {
		init();
	}

	private void init() throws Exception {
		try {

			Properties properties = new Properties();
			// 設置velocityp 配置
			properties.load(new FileInputStream(new File("./config/velocity.properties")));
			Velocity.init(properties);
			velocityEngine = new VelocityEngine();
		}
		catch (Exception ex) {
			throw ex;
		}
	}

	public String getResult(String type, String version, String key, String template, VelocityContext context) {
		// 添加通用的處理函數
		context.put("DateFormatUtils", DateFormatUtils.class);
		// 返回報文
		StringWriter sw = new StringWriter();
		String path = baseTemplatePath + "/" + type + "/" + version + "/" + key + "/" + template;
		velocityEngine.mergeTemplate(path, encoding, context, sw);
		return sw.toString();
	}

	public String getBaseTemplatePath() {
		return baseTemplatePath;
	}

	public void setBaseTemplatePath(String baseTemplatePath) {
		this.baseTemplatePath = baseTemplatePath;
	}

	public String getEncoding() {
		return encoding;
	}

	public void setEncoding(String encoding) {
		this.encoding = encoding;
	}

	public GeneralDataAdapter(String baseTemplatePath, String encoding) throws Exception {
		super();
		this.baseTemplatePath = baseTemplatePath;
		this.encoding = encoding;
		init();
	}

	public GeneralDataAdapter(String baseTemplatePath, VelocityEngine velocityEngine, String encoding) throws Exception {
		super();
		this.baseTemplatePath = baseTemplatePath;
		this.velocityEngine = velocityEngine;
		this.encoding = encoding;
		init();
	}

}
package com.echo.api;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.velocity.VelocityContext;

import com.echo.api.velocity.impl.GeneralDataAdapter;
import com.echo.api.velocity.inter.IDataAdapter;

/**
 * 使用velocity設計複雜多變的報文接口,在bean相同狀況下實現不一樣的輸出
 * <p>
 * Copyright: Copyright (c) 2015年9月9日 下午3:27:47
 * <p>
 * <p>
 * 
 * @author lihuan
 * @version 1.0.0
 */
public class TestAipVersion {

	/**
	 * main函數.
	 * 
	 * @param args
	 *            啓動參數
	 * @throws Exception
	 *             Exception
	 */
	public static void main(String... args) throws Exception {

		VelocityContext context = new VelocityContext();
		// 同一數據源,輸出不一樣報文以及不一樣的格式
		List<User> users = new ArrayList<User>();
		users.add(new User("張三", 23, "張家莊良民", new Date(), "shaoyishao"));
		// users.add(new User("李四", 25, "李家莊好人", new Date(), "shaoyishao"));
		// users.add(new User("王五", 39, "王莊刁民啊", new Date(), "shaoyishao"));

		context.put("userList", users);
		// json數據
		IDataAdapter generalDataAdapter = new GeneralDataAdapter("./templates", "utf-8");
		// json報文
		long stime = 0;
		stime = System.currentTimeMillis();
		System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_JSON, "1.0.0", "android", "userlist.vm", context));
		System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_JSON, "1.0.0", "android640", "userlist.vm", context));
		// xml報文
		stime = System.currentTimeMillis();
		System.out.println(generalDataAdapter.getResult(IDataAdapter.TYPE_XML, "1.0.0", "android", "userlist.vm", context));

	}
}

輸出json,xml,以及不一樣屏幕設計

文案不一樣=====不一樣屏幕設備
小屏幕顯示文字較少
[{
"count:":  1,
"name":"張三",
"age":23,
"remark":"張家莊良民",
"regTime":"20150909170631",
"btn1":"掃一掃"
}
]	
  大屏幕顯示文字較多,
[{
"count:":  1,
"name":"張三",
"age":23,
"remark":"張家莊良民",
"regTime":"20150909170631",
"btn1":"掃一掃就知道"
}
]	
  
<?xml version="1.0" encoding="utf-8" ?>
<data><users><user>
<count>1</count>
<name>張三</name>
<age>23</age>
<remark>張家莊良民</remark> 
<regTime>2015年09月09日 17:06:31</regTime> 
</user>
</users>
</data>
相關文章
相關標籤/搜索