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

MVC 模式在 J2ME 專案實戰應用(二):記事本完整設計與代碼實現

     編輯:J2ME

專案背景:手機端輕量記事本

手機是隨身數位終端,記錄碎片資訊是剛需。Note 專案目標:單機版記事本,支援新增、瀏覽、編輯、刪除、重命名,採用 MVC 嚴格分層,驗證架構在資源受限平台的落地可行性。

用例模型與事件流

三大核心用例

  1. NoteEdit(編輯記錄):新建/修改內容 → 儲存/另存/放棄
  2. Notepad(瀏覽記錄):顯示標題/時間/內容 → 返回/進入編輯
  3. NoteManager(管理記錄):列表顯示 → 開啟/編輯/新增/刪除(含確認)

事件流圖(省略)已轉化為循序圖,驅動類別發現。

領域模型與類別職責

層級類別(命名慣例)職責
Model (Entity)Note資料實體:id、title、content、datetime;getter/setter、序列化
NoteLocator生命週期管理:RMS 持久化、查詢、快取、單例模式
Controller (Workflow)NoteManagerWorkflow管理用例控制:列表資料準備、刪除協調、ID/Title 雙陣列維護
NoteEditWorkflow編輯用例控制:載入/儲存/另存邏輯、惰性初始化 Note 實體
NotepadWorkflow瀏覽用例控制:資料轉換、轉向編輯流程
View (Boundary/UI)NoteManagerUI列表畫面:List 元件、命令處理、向 Workflow 索取 String[]
NoteEditUI編輯畫面:Form + TextField、儲存/另存命令、回調 Workflow
NotepadUI瀏覽畫面:顯示完整內容、編輯/返回命令

關鍵設計細節解析

1. UI 與 Workflow 通訊契約(介面導向)

// NoteManagerUI 完全不曉得 RMS、Note 物件結構
public interface NoteManagerDataProvider {
    String[] getTitleList(); // 供 List 顯示
    String[] getIdList();    // 內部識別用,不顯示
    void deleteNote(int index); // 委派刪除
}

NoteManagerUI 持有 NoteManagerDataProvider 介面參考,實作類為 NoteManagerWorkflow。編譯期依賴倒置,UI 層零業務邏輯。

2. Workflow 與 Locator 協作:單例 + 惰性初始化

public class NoteManagerWorkflow implements NoteManagerDataProvider {
    private NoteLocator locator = NoteLocator.getInstance(); // 單例
    private String[] titleCache, idCache;

    public String[] getTitleList() {
        if (titleCache == null) refreshCache();
        return titleCache;
    }
    private void refreshCache() {
        Vector notes = locator.findAllNotes(); // 從 RMS 載入
        titleCache = new String[notes.size()];
        idCache = new String[notes.size()];
        for (int i=0;i locator.deleteNote(idCache[index]) -> refreshCache()
}

3. 惰性初始化在 NotepadWorkflow 的應用

public class NotepadWorkflow {
    private Note note; // 實體引用
    private String noteId;

    public Note getNote() { // 供 UI 呼叫取資料
        if (note == null && noteId != null) {
            note = NoteLocator.getInstance().findById(noteId); // 首次載入
        }
        return note;
    }
    // UI 呼叫 getNote().getTitle() 等,無需知悉載入細節
}

避免預載入大量 Note 物件佔用堆疊,按需載入、按需釋放。

完整 UML 類別圖

Note 專案完整 UML 類別圖

螢幕流程與導航圖

畫面導航流程圖

啟動 → Manager列表 → (新增/選中) → Edit/Notepad → 儲存/返回 → Manager 刷新

實機截圖展示

Manager 列表
Manager 列表
Edit 新建
Edit 新建
儲存輸入標題
儲存輸入標題
列表更新
列表更新
Notepad 瀏覽
Notepad 瀏覽

基礎架構代碼:BaseView & BaseController

// BaseView.java
public abstract class BaseView {
    public abstract Display getDisplay();
    public abstract Displayable getScreen();
    protected abstract void createView() throws Exception;
    public abstract void updateView() throws Exception;
    public abstract BaseController getController();

    public Displayable prepareScreen() throws Exception {
        if (getScreen() == null) createView(); else updateView();
        return getScreen();
    }
    public void displayScreen() {
        try { getDisplay().setCurrent(prepareScreen()); }
        catch (Exception e) { showError(e); }
    }
}

// BaseController.java
public abstract class BaseController {
    public abstract BaseView getView();
    public abstract void setView(BaseView view);
}

構造時雙向綁定:controller.setView(view); view.getController() == controller,避免 NPE。

經驗總結與最佳實踐

  1. 介面先行:先定 UI-Workflow 契約介面,再實作雙方,強迫解耦。
  2. 單元測試優先:Model (Note)、Locator (RMS 操作) 可獨立 JUnit 測試,無需模擬器。
  3. 偽資料驅動開發:Workflow 方法先回傳硬編碼假資料,UI 先跑通流程,再接真實 Locator。
  4. 惰性初始化:大幅降低啟動記憶體峰值,符合 J2ME 資源限制。
  5. 類別膨脹可控:雖增加類別數,但單一職責換來可維護性,利大於弊。

結語

Note 專案證明:MVC 在 J2ME 不僅可行,更是中型以上專案的必然選擇。嚴格分層讓 RMS 操作、UI 邏輯、業務流程各自可測、可替換。代碼雖多,但結構清晰,新成員閱讀 BaseView/BaseController 即可掌握全專案協作規範。這正是「架構服務於人」的最佳註腳。

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