這一篇是我在Design Pattern for Java ME Canvas based applications的中文翻譯,總共翻譯了15天,中間雖然夾雜著更改工作達人的佈景,不過仍算是久的了,網址在Java ME Canvas基礎應用程式的設計樣式!
為了備份,並轉貼在此:
問題
每個使用Java ME工作的人必定會碰到在切換可顯示的物件時這個“一閃而過(flicker)”的問題,例如從已經在View的一個畫布設定一個新的畫布,你會仔細想過 可顯示的畫布不應該一次又一次地設定,我們在整個應用程式中應該只使用一個畫布設定,而這樣會產生一個長期不可管理的Canvas類別,這個類別會有很長 的鍵盤按下/釋放、繪製方法及一堆的Switch case / if then else等等,這樣可會影響程式的效率及可讀性。
解決方案
我們必須以這樣的一個方式設計一個解決方案,這個方案就是只有一個Canvas(BaseCanvas – 鍵下面的程式碼)只有一次被midlet設為目前可顯示的,且對不同的應用程式模組使用物件導向方法來建構不同的Canvas螢幕,這些模組可以藉由一個 共同的介面類別物件在BaseCanvas傳遞而不用flicker,每個螢幕處理繪製及式鍵的程式碼用這樣不同的螢幕類別來分隔,這樣可因此變得較易閱 讀及效率。
優點
- 容易擴展
- 教友效率的程式碼
- 較可閱讀的程式碼
- 較低的記憶體佔用
程式碼
BaseCanvas會在下面
import javax.microedition.lcdui.*; public class BaseCanvas extends Canvas { /**Singleton Instance**/ private static BaseCanvas mCanvas; /** Singleton Accessor Method with lazy initialization**/ public static Canvas getCanvas() {if(mCanvas==null) mCanvas=new BaseCanvac(); return mCanvas; } public CanvasScreen setCurrentScreen(CanvasScreen aCs) { CanvasScreen old=mCs; mCs=aCs; return old; } public void paint(Graphics g) { if(null!=mCs) mCs.paint(g); } public void keyPressed(int keyCode) { if(null!=mCs) mCs.keyPressed(keyCode); } public void keyRepeated(int keyCode) { if(null!=mCs) mCs.keyRepeated(keyCode); } /**Stratergy Object **/ private CanvasScreen mCs=null; private BaseCanvas() { setFullScreenMode(true); } }
CanvasScreen介面會在下面
import javax.microedition.lcdui.*; public interface CanvasScreen { public void paint(Graphics g); public void keyPressed(int keyCode); public void keyRepeated(int keyCode); }
所有應用程式不同的模組的其他螢幕或canvas類別會在下面
(例如,SplashScreen)
import javax.microedition.lcdui.*; public class SplashScreen implements CanvasScreen { BaseCanvas bc; public SplashScreen() { this.bc=BaseCanvas.getCanvas(); bc.setCurrentScreen(this); // do what you want to paint on splash screen and load your assests. } public void keyRepeated(int keyCode){ } public void paint(Graphics g) { // paint your Splash Screen // paint Loader(g); } public void keyPressed(int keyCode) { // do what you need } private void repaint() { bc.repaint(); } }
所有其他的螢幕類別將實做CanvasScreen介面,來執行他們自己的繪製及事件處理。
執行緒的安全
上面所說的存取BaseCanvas類別不是執行緒安全,不同執行緒的同時存取會造成不可預測的結果,所以假如一個應用程式從不同的執行緒存取這個類別那麼存取它應該是同步的。
–Linux achi於2009/9/15 15:38翻譯.