做了快一年的手機應用程式,抽空寫點對應用程式架構的認識吧。本文以J2ME手機應用程式為執行個體。介紹一下在公司專屬應用程式的開發中,都會涉及到哪些方面的程式架構特徵。
J2ME技術從誕生到現在還處於不斷的發展壯大中,雖然各種手機對JSR標準支援的差異,各廠商的虛擬機器實現的差異,或多或少的阻礙了J2ME最大的優勢————跨平台性的體現,但是也不可否認,J2ME技術仍然是當前作為移動開發領域最主要的技術之一。因為它開發簡便,可移植性強,使從事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層的顯示,就可以適應不同的應用類型了。歡迎加我MSN討論應用開發,k7sem_88@hotmail.com