首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 架構模式:MIDlet 與 UI 分離的實戰範例

     編輯:J2ME

前言:為什麼要分離?

J2ME 單文件寫法雖簡潔,但隨著界面增多、邏輯複雜,「上帝類」 MIDlet 會變得不可維護。將 MIDlet (應用控制器) 與 Displayable (視圖) 分離,遵循 MVC 思想,帶來:

  • 邏輯可單元測試(無 LCDUI 依賴)。
  • 界面可複用/替換(Canvas ↔ Form)。
  • 團隊並行開發(邏輯組 / UI 組)。

一、 分離的兩個核心契約

  1. Display 對象傳遞:視圖構造時接收 Display,自行 setCurrent() 或由 MIDlet 統一分發。
  2. 退出/導航回調:視圖持有 MIDlet 引用(或靜態方法),調用 midlet.quitApp() / midlet.showSettings() 等。

二、 代碼範例:登錄界面分離

1. MIDlet 主控制器

package testmidlet;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class TestMIDlet extends MIDlet {
    private static TestMIDlet instance;
    private LoginForm loginForm;

    public TestMIDlet() {
        instance = this;
        loginForm = new LoginForm(this); // 注入自身引用
    }

    protected void startApp() {
        Display.getDisplay(this).setCurrent(loginForm);
    }

    protected void pauseApp() {}
    protected void destroyApp(boolean u) {}

    /** 供視圖調用的退出入口 */
    public static void quitApp() {
        instance.destroyApp(true);
        instance.notifyDestroyed();
        instance = null; // 釋放單例引用
    }

    /** 導航到其他界面 */
    public void showMainMenu() {
        Display.getDisplay(this).setCurrent(new MainMenuForm(this));
    }
}

2. 視圖:LoginForm

package testmidlet;

import javax.microedition.lcdui.*;

public class LoginForm extends Form implements CommandListener {
    private TestMIDlet midlet;

    public LoginForm(TestMIDlet midlet) {
        super("Login");
        this.midlet = midlet;
        append(new TextField("User:", "", 20, TextField.ANY));
        append(new TextField("Pass:", "", 20, TextField.PASSWORD));
        addCommand(new Command("Login", Command.OK, 1));
        addCommand(new Command("Exit", Command.EXIT, 2));
        setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d) {
        if (c.getCommandType() == Command.OK) {
            // 驗證邏輯...
            midlet.showMainMenu(); // 導航
        } else if (c.getCommandType() == Command.EXIT) {
            TestMIDlet.quitApp(); // 退出
        }
    }
}

三、 進階模式:狀態機導航器

當界面超過 5 個時,建議引入 Navigator 統一管理:

public class Navigator {
    private static Display display;
    private static Displayable previous;

    public static void init(MIDlet midlet) {
        display = Display.getDisplay(midlet);
    }

    public static void go(Displayable next) {
        previous = display.getCurrent();
        display.setCurrent(next);
    }

    public static void back() {
        if (previous != null) display.setCurrent(previous);
    }
}

// 視圖中調用:Navigator.go(new SettingsForm()); Navigator.back();

四、 關鍵點總結

要點做法收益
MIDlet 不持有具體 UI 類依賴接口或基類 Displayable解耦,易測試
視圖不直接操作生命週期調用 MIDlet 封裝方法 quitApp()集中控制,避免重複代碼
Display 獲取集中化Display.getDisplay(midlet) 僅在 MIDlet/Navigator 中調用避免傳遞錯誤的 MIDlet 引用
單例 MIDlet 謹慎使用僅作為靜態工廠入口,退出時置 null防止內存洩漏,允許重啟

五、 總結

「MIDlet 做調度,UI 做渲染與交互」,這條分界線劃清後,代碼結構清晰、擴展性強。即使專案微小,養成分離習慣也能避免日後重構之痛。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved