程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> JavaMe開發:也說MVC設計模式(1)

JavaMe開發:也說MVC設計模式(1)

編輯:J2ME

【更新】本文將適時做出更新,所以現在不是終稿,如有不當之處,敬請指出。

【問題描述】介紹設計模式的文章和書很多,但只有使用時,才能理解設計模式的妙處。接上一篇《JavaMe連載(2)-低級界面繪圖之菜單》,本文一則對UIController作出解釋,一則將自己理解的MVC設計模式,結合實例,與大家交流學習。

【理論】什麼是MVC?

MVC就是模型(model)、視圖(vIEw)和控制(control)。什麼是模型呢?本例中,模型就是對數據使用時的封裝。視圖很容易理解,那就是顯示內容的具體表示。控制呢?有很多人對視圖和控制分不清。在本例中,控制包含視圖控制器以及方法的封裝。

【實例】

1、先看工程結構,如圖1所示。


圖1 工程結構

工程中將用戶數據單獨封裝,作為model。供控制器和視圖調用。將顯示頁面單獨封裝,作為視圖。將視圖控制器UIController和常用方法封裝為util。UIController就是控制。

2、UML圖(後續更新時補充)

先看代碼,再分析工作機理

【代碼清單】

MainMidlet.Java

  1. package com.token.midlet;
  2. import Java.io.IOException;
  3. import Javax.microedition.lcdui.*;
  4. import Javax.microedition.midlet.MIDlet;
  5. import Javax.microedition.midlet.MIDletStateChangeException;
  6. import com.token.util.UIController;
  7. public class MainMidlet extends MIDlet {
  8. private Display display;
  9. private static UIController controller;
  10. public MainMidlet() {
  11. // TODO Auto-generated constructor stub
  12. super();
  13. display=Display.getDisplay(this);
  14. }
  15. /* (non-Javadoc)
  16. * @see Javax.microedition.midlet.MIDlet#pauseApp()
  17. */
  18. protected void startApp() throws MIDletStateChangeException {
  19. controller=new UIController(this);
  20. try {
  21. controller.init();
  22. } catch (IOException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }//初始化RecordStore
  26. }
  27. /* (non-Javadoc)
  28. * @see Javax.microedition.midlet.MIDlet#pauseApp()
  29. */
  30. protected void pauseApp() {
  31. this.notifyPaused();
  32. }
  33. /* (non-Javadoc)
  34. * @see Javax.microedition.midlet.MIDlet#destroyApp(boolean)
  35. */
  36. protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
  37. controller=null;
  38. }
  39. public void setCurrent(Displayable disp){
  40. display.setCurrent(disp);
  41. }
  42. public void setCurrent(Alert alert, Displayable disp){
  43. display.setCurrent(alert, disp);
  44. }
  45. public Displayable getCurrent(){
  46. return display.getCurrent();
  47. }
  48. public void exit(boolean arg0){
  49. try{
  50. destroyApp(arg0);
  51. notifyDestroyed();
  52. }catch(MIDletStateChangeException e){
  53. //
  54. }
  55. }
  56. }

模型(Model)

UserDataItem.Java

  1. package com.token.model;
  2. import com.token.util.StringDealMethod;
  3. public class UserDataItem {
  4. private int id;
  5. public String name = null;
  6. public String passwd = null;
  7. public UserDataItem(String name,String passwd)
  8. {
  9. this.name = name;
  10. this.passwd = passwd;
  11. }
  12. public UserDataItem(int id,byte[] data){
  13. this.id=id;
  14. String temp=new String(data);
  15. String temp_sub[] = StringDealMethod.split(temp, ",");
  16. this.name = temp_sub[0];
  17. this.passwd = temp_sub[1];
  18. }
  19. public int getId(){
  20. return id;
  21. }
  22. public void setId(int id){
  23. this.id=id;
  24. }
  25. public String getName(){
  26. return name;
  27. }
  28. public void setName(String name){
  29. this.name = name;
  30. }
  31. public String getPasswd(){
  32. return passwd;
  33. }
  34. public void setPasswd(String passwd){
  35. this.passwd = passwd;
  36. }
  37. public byte[] getBytes(){
  38. String temp=null;
  39. if(name==null||passwd==null){
  40. return null;
  41. }else{
  42. temp=name+","+passwd;
  43. }
  44. return temp.getBytes();
  45. }
  46. }

控制(control)

UIController.Java

  1. package com.token.util;
  2. import Java.io.IOException;
  3. import Javax.microedition.lcdui.*;
  4. import com.token.midlet.MainMidlet;
  5. import com.token.model.*;
  6. import com.token.vIEw.*;
  7. //import com.token.vIEw.components.Color;
  8. public class UIController {
  9. private MainMidlet midlet;
  10. private TokenDataRecord tokenRecord;
  11. private WelcomeScreen welcomeScreen;
  12. private UserRegist reg;
  13. private ActiveScreen activeScreen;
  14. private MainScreen mainScreen;
  15. private GenPasswd gen;
  16. private CheckScreen check;
  17. private ViewToken vIEwToken;
  18. private UserManage manage;
  19. private ShowHelp help;
  20. private UserAuth auth;
  21. private PopUpTextBox textBox;
  22. int id = 1;
  23. public UIController(MainMidlet midlet)
  24. {
  25. this.midlet = midlet;
  26. tokenRecord = new TokenDataRecord();
  27. }
  28. public void init() throws IOException{
  29. try {
  30. SplashScreen splashScreen = new SplashScreen();
  31. setCurrent(splashScreen);
  32. Thread.sleep(1000);
  33. Configure.configureColor();
  34. initObject();
  35. //tokenRecord.db_deleteAllRecord();
  36. if(tokenRecord.db_getRecord(1)==null)
  37. {
  38. //System.out.println("add");
  39. ChaosMethods method = new ChaosMethods();
  40. TokenDataItem tokenItem = new TokenDataItem(1,(method.ChaosInitCode()+",false").getBytes());
  41. id=tokenRecord.db_addRecord(tokenItem);
  42. }
  43. //System.out.println(id);
  44. TokenDataItem tokenItem1 = tokenRecord.db_getRecord(id);
  45. //System.out.println(tokenItem1.token+","+tokenItem1.isActive);
  46. if(tokenItem1.getStatus().equals("false"))
  47. {
  48. this.handleEvent(UIController.EventID.EVENT_NEXT_WELCOME_SCREEN,null);
  49. }else
  50. {
  51. String flag = "0";
  52. Object [] args = {flag,""};
  53. this.handleEvent(UIController.EventID.EVENT_MAIN_SCREEN,args);
  54. }
  55. } catch (InterruptedException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. }
  59. }
  60. private void initObject()
  61. {
  62. welcomeScreen = new WelcomeScreen(this);
  63. reg= new UserRegist(this);
  64. activeScreen = new ActiveScreen(this);
  65. ...
  66. textBox = new PopUpTextBox(this,"輸入文本","", 1000, TextFIEld.ANY);
  67. }
  68. //getMethod
  69. public void setCurrent(Displayable disp){
  70. midlet.setCurrent(disp);
  71. }
  72. public void setCurrent(Alert alert, Displayable disp){
  73. midlet.setCurrent(alert, disp);
  74. }
  75. //定義事件ID內部類
  76. public static class EventID{
  77. private EventID(){
  78. }
  79. public static final byte EVENT_EXIT = 0;//退出
  80. public static final byte EVENT_NEXT_WELCOME_SCREEN = 1;//歡迎界面
  81. public static final byte EVENT_NEXT_USER_REGIST_SCREEN = 2;//用戶注冊
  82. public static final byte EVENT_USER_REGIST_EDIT = 3;//用戶注冊編輯
  83. public static final byte EVENT_USER_REGIST_EDIT_BACK = 4;//用戶注冊編輯返回
  84. public static final byte EVENT_NEXT_ACTIVE_SCREEN = 5;
  85. //...
  86. }
  87. //事件處理
  88. public void handleEvent( int eventID, Object[] args)
  89. {
  90. switch (eventID)
  91. {
  92. case EventID.EVENT_EXIT:
  93. {
  94. midlet.exit(false);
  95. break;
  96. }
  97. case EventID.EVENT_NEXT_WELCOME_SCREEN:
  98. {
  99. welcomeScreen.show();
  100. midlet.setCurrent(welcomeScreen);
  101. break;
  102. }
  103. case EventID.EVENT_NEXT_USER_REGIST_SCREEN:
  104. case EventID.EVENT_USER_REGIST_EDIT_BACK:
  105. {
  106. reg.show(args);
  107. Thread thread = new Thread(reg);
  108. thread.start();
  109. midlet.setCurrent(reg);
  110. break;
  111. }
  112. case EventID.EVENT_USER_REGIST_EDIT:
  113. {
  114. textBox.init(args);
  115. midlet.setCurrent(textBox);
  116. break;
  117. }
  118. case EventID.EVENT_NEXT_ACTIVE_SCREEN:
  119. {
  120. activeScreen.show(args);
  121. Thread thread = new Thread(activeScreen);
  122. thread.start();
  123. midlet.setCurrent(activeScreen);
  124. break;
  125. }
  126. //...
  127. default:
  128. break;
  129. }
  130. }
  131. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved