MVC (Model-View-Controller) 由 Trygve Reenskaug 於 1979 年 Smalltalk-79 專案提出,核心只有一個字:**分離**。
分離帶來三大收益:專業分工、UI 變更隔離、Model 可重用可測試。
| 挑戰 | 影響 | 應對策略 | |
|---|---|---|---|
| 類別數量膨脹 | JAR 體積、載入時間增加 | 合併細粒度 Controller、共用 Base 類、ProGuard 混淆壓縮 | |
| 記憶體極限 | 多層物件參考佔用堆疊 | 惰性初始化、場景級釋放、物件池 | |
| 單執行緒 UI 模型 | Controller 不能阻塞事件派發執行緒 | 耗時操作放入背景 Thread、Callback 回 UI 執行緒 | |
| 畫面導航複雜 | Controller 易變成「上帝類」 | 導航邏輯獨立為 Navigator/Router、狀態機管理 |
| 層級 | 後綴 | 對應 MVC | 核心職責 |
|---|---|---|---|
| Boundary (View) | UI | View | 畫面構建、使用者輸入收集、回調 Controller 方法、零業務邏輯 |
| Controller (Workflow) | Workflow | Controller | 接收 UI 回調、協調 Locator/Entity、業務流程編排、狀態機管理 |
| Entity (Model) | Entity / 無 | Model | 純資料結構、getter/setter、序列化、業務規則驗證、零持久化邏輯 |
| Locator (Lifecycle) | Locator | Model 輔助 | Entity 的 CRUD、RMS/檔案/網路持久化、查詢、快取、單例管理 |
NoteEditUI 輸入內容,按「儲存」命令NoteEditUI.commandAction() → 呼叫 noteEditWorkflow.saveNote()NoteEditWorkflow.saveNote() → 從 UI 取得資料 → 建立/更新 NoteEntityNoteEditWorkflow → 呼叫 NoteLocator.save(note) → RMS 持久化NoteEditWorkflow 通知 NoteEditUI 返回列表 → NoteManagerUI.refresh()關鍵隔離:UI 不知 RMS、Locator 不知 UI、Entity 不知持久化細節。依賴方向單向向內,最內層 Entity 最純粹、最可重用。
// 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) { showErrorAlert(e); }
}
}
// BaseController.java
public abstract class BaseController {
public abstract BaseView getView();
public abstract void setView(BaseView view);
}
構造時雙向綁定:new NoteEditUI(workflow); workflow.setView(ui);
| 專案規模/性質 | 推薦架構 | 理由 |
|---|---|---|
| 單一畫面、<5 類、一次性專案 | iFeedback 單類 / 簡單 MV | 開發速度優先,維護成本可控 |
| 多畫面、表單導向、需快速迭代 UI | Sun Smart Ticket Dispatcher | 導航集中管理,View 可整體替換 |
| 中大型、複雜業務邏輯、長期維護、團隊協作 | BCEL 四層 (本文推薦) | 職責清晰、可測試、可擴展、新人上手快 |
| 遊戲專案(主迴圈、狀態機) | 遊戲專用:GameLoop + StateMachine + EntitySystem | MVC 不適合遊戲幀級更新,需 ECS/狀態機架構 |
MVC 非銀彈,而是管理複雜度的框架契約。在 J2ME 這樣資源受限、API 低階的平台上,盲目套用桌面/網頁 MVC 會帶來沉重負擔。關鍵在於:理解分離的本質、識別專案真實痛點、選擇適合當下的變體、建立團隊共識的命名與協作規範。下一篇將以完整記事本專案,示範 BCEL 四層架構的落地細節與代碼實戰。