因為它開發簡便,可移植性強,使從事Java的開發者可以很快的投入J2ME開發,相比SymBian平台的C++開發可謂是容易許多。
作為企業客戶的應用,現在以C/S模式為主,服務器端保存用戶數據,以及響應在線用戶的復雜業務邏輯。客戶端作為數據的接收者,處理簡單的業務邏輯,保存少量的數據,例如聊天紀錄,本地賬號和密碼等。當然客戶端也可能是PC。
圖1比如一款手機的即時通訊軟件IM(Instant Message),服務器端需要支持多客戶端同時在線,保存客戶信息,處理每個客戶端發過來的請求,將A客戶的信息轉發給B客戶,將C客戶的離線信息轉發給C客戶的所有好友,等等。也就是說一個客戶端於另一個客戶端所有的溝通都要通過服務器去中轉。下面來介紹一下客戶端的一個簡單的架構模型。
我們可以用MVC的設計理念來設計這個框架。大致可分為以下幾個層次。
Handler:處理網絡請求,網絡消息分發,這個層面是最關鍵的,它會涉及到整體結構的每一層。
Database:用來存儲少量數據,在J2ME中,RMS(Record Management System)是這個層次主要承擔者。每個手機可能對RMS的大小支持不同,使這寶貴的存儲空間更加珍貴。Handler會控制對Database的存儲和提取,用來VIEw層顯示。
Model:這個層次主要是根據程序需要創建的一些邏輯控制類。把數據封裝,創建公共接口等。比如一條消息,可能會創建一種Message類型來存儲在數據庫中。
VIEw:這層用來顯示用戶界面,並且響應和處理鍵盤的指令。將Handler層指派的一些信息顯示出來,並且將需求信息送給Handler去處理。所以這層直接於Handler溝通,不會直接涉及到Database或網絡信息。
圖2當然在實際的應用開發中會更復雜一些。比如會有一個session的東西來控制消息的輪詢和網絡連接。下面我通過一個偽代碼來進一步說明這個模型。
/**VIEw:Display messsage, Receive input*/
package vIEw;
import.....
public class vIEw extends Canvas
{
public String getUserName();
public String getUserPassWord();
public void displayMessage(Graphics g)
{
g.drawString(Handler.getInstance().getMessageContent(),x,y,0);
}
public void commandAction(Command c,Displayable d)
{
Handler.getInstance().setUserInfo(getUserName(),getUserPassWord());
}
}
/**************************************/
/*Handler:Control network message*/
package handler;import......
public class Handler
{
public sendUserInfo(String name,String passWord);
public void getResponse()
{
if(ok)
{
notfiyDisplay();
}
}
public void notfiyDisplay()
{
Message mess = new Message( mess.toString() ) ;
Database.putMessage( mess )
VIEw.getInstance().repaint();
}
public String getMessageContent()
{
Message m = Database.getInstance.getMessage();
return m.getContent();
}
}
/************************************/
/*Message: a model indicate message object*/
package model;import......
public class Message
{
public Message(String str)
{
}
public String getContent()
{
}
}
/**********************************//*Database: store bytes*/
package database;
import......
public Database
{
public void putMessage(Message mess)
{
}
public Message getMessage()
{
}
}
/***********************************/
復雜的應用還要處理多媒體內容,各種類型的連接方式,而且對於線程管理,網絡連接都要求更高。值得注意的是,一般應用的代碼是可以復用的。這樣只要改一些VIEw層的顯示,就可以適應不同的應用類型了。