扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:中国IT实验室 来源:中国IT实验室 2007年9月23日
关键字:
在本页阅读全文(共6页)
较老的移动商务平台,比如基于 WAP/WML 的微型浏览器将所有的信息处理都放置在服务器端。 J2ME 的一个重要优势是它支持运行在客户机上智能客户端程序。Smart Ticket 充分体现了智能客户端应用程序范例的优势:
怎样实现这些特性?
Smart Ticket 应用程序的总体体系结构遵循模式-视图-控制器(Model-View-Controller)模式。这个应用程序被分为多个逻辑层,因此开发人员在修改一部分时不会影响其他部分。 Smart Ticket 符合 MVC 模型,如下所示:
视图:每个视图类显示一个交互式 UI(用户界面)屏幕,等待用户输入。当用户通过按键或从列表中选择一个条目时将产生一个 UI 事件,视图类的事件处理程序捕获这个事件,并将控制传递给控制器类。在 com.sun.j2me.blueprints.smartticket.client.midp.ui
包中的大多数类都是视图类。
public class ChooseMovieUI extends Form implements CommandListener, ItemStateListener, ItemCommandListener { private UIController uiController; // ... public void commandAction(Command command, Displayable displayable) { uiController.commandAction(command, displayable); } public void commandAction(Command command, Item item) { if (command == selectSeatsCommand) { if (numOfTickets.getString().length() == 0 || Integer.parseInt(numOfTickets.getString()) < 1) { uiController.showErrorAlert( uiController.getString( UIConstants.NUM_OF_TICKET_ERR)); } else { uiController.selectSeatsSelected( movieSchedules[movieList.getSelectedIndex()], getShowTimes()); } } } }
控制器:控制器类感知用户和程序之间的所有可能的交互。在 Smart Ticket 中,UIController
类有用于每个可能动作的方法,例如,purchaseRequested()
。动作方法经常启动两个新的线程,一个用于执行后台的动作,另一个用于向用户显示进度条。动作线程通过 EventDispatcher
类来表示,它的 run()
方法包括一条很长的 switch 语句,此语句在模型层调用合适的方法完成事件请求。当这些方法的最后一次调用返回时,控制器初始化下一个 UI 画面并显示出来。
package com.sun.j2me.blueprints.smartticket.client.midp.ui; public class UIController { // references to all UI classes // ... public UIController(MIDlet midlet, ModelFacade model) { this.display = Display.getDisplay(midlet); this.model = model; } // ... public void selectSeatsSelected(TheaterSchedule.MovieSchedule movieSchedule, int[] showTime) { selectedShowTime = showTime; selectedMovie = movieSchedule.getMovie(); selectedMovieSchedule = movieSchedule; runWithProgress( new EventDispatcher(EventIds.EVENT_ID_SELECTSEATSSELECTED, mainMenuUI), getString(UIConstants.PROCESSING), false); } class EventDispatcher extends Thread { private int taskId; private Displayable fallbackUI; EventDispatcher(int taskId, Displayable fallbackUI) { this.taskId = taskId; this.fallbackUI = fallbackUI; return; } public void run() { try { switch (taskId) { // cases ... case EventIds.EVENT_ID_SELECTSEATSSELECTED: { SeatingPlan seatingPlan = selectedMovieSchedule.getSeatingPlan(selectedShowTime); String movieName = selectedMovie.getTitle(); seatingPlanUI.init(selectedTheater.getName(), movieName, seatingPlan, selectedShowTime); display.setCurrent(seatingPlanUI); break; } case EventIds.EVENT_ID_SEATSSELECTED: { reservation = model.reserveSeats(selectedTheater.getPrimaryKey(), selectedMovie.getPrimaryKey(), selectedShowTime, selectedSeats); purchaseTicketsUI.init(model.getAccountInfo()); display.setCurrent(purchaseTicketsUI); break; } case EventIds.EVENT_ID_PURCHASEREQUESTED: { model.purchaseTickets(reservation); purchaseCompleteUI.init(reservation.getId(), selectedTheater.getName(), selectedMovie.getTitle(), selectedShowTime); display.setCurrent(purchaseCompleteUI); break; } // Other cases ... } } catch (Exception exception) { // handle exceptions } } // end of run() method } // end of EventDispatcher class }
让我们看看模型层的详细内容。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者