分享
 
 
 

应用MVC设计模式解决J2ME应用程序导航问题

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

开发MIDlet的程序员也许经常会被界面的导航问题所困扰,尤其界面比较多的时候,通常有七、八个界面就会很让人头疼了。本文讲述如何应用MVC设计模式解决这类的问题。

MVC设计模式已经非常的成熟并在WEB Application的开发中广泛使用,apache的开源项目struts就是典型的例子。MVC的本质就是是逻辑和显示分开,通过控制器进行协调。通常我们会感到控制器比较的肥大,这个是个有争议的问题。MIDP的用户界面开发是比较简单的,只有那么20几个类。但是由于导航一般只能通过Command来实现,所以界面增多的情况下,如果没有有效的组织那么程序写起来非常的乱,最致命的是这样的程序可读性差、扩展性差、可维护性差。

应用MVC解决这个问题的关键是提供一个桥梁作用的控制器,它通常要有一个MIDlet作为参数。例如 public UIController(PhoneBookMIDlet pbm)

{

this.phoneBookMIDlet = pbm;

}

为了传递事件,你可以定义一个内部类,在里面定义事件的代号。这样用起来非常的方便例如

public static class EventID

{

private EventID()

{

}

public static final byte EVENT_NEW_RECORD_SELECTED = 1;

public static final byte EVENT_SAVE_RECORD = 2;

public static final byte EVENT_NEWPHONE_BACK_MAINUI = 3;

public static final byte EVENT_LISTPHONE_BACK_MAINUI = 4;

public static final byte EVENT_SEARCHUI_BACK_MAINNUI = 5;

public static final byte ADD_NEW_RECORD = 100;

public static final byte SEARCH_RECORD = 101;

public static final byte CLEAR_RECORD = 102;

public static final byte LIST_RECORD = 103;

public static final byte HELP = 104;

}我们要在这个控制器内初始化各个界面类,这样我们才能根据不同的事件代号进行导航。

public void init(Model model)

{

this.display = Display.getDisplay(phoneBookMIDlet);

this.model = model;

indexFunctionUI = new IndexFunctionUI(this);

infomationUI = new InfomationUI();

newPhoneUI = new NewPhoneUI(this);

listPhoneUI = new ListPhoneUI(this);

searchPhoneUI = new SearchPhoneUI(this);

displayWelcome();

}

public void setCurrent(Displayable disp)

{

display.setCurrent(disp);

}

public void setCurrent(Alert alert, Displayable disp)

{

display.setCurrent(alert, disp);

}由于本文主要讲述如何实现导航,因此关于Model不做任何介绍。细心的话你也许可以看出来我这些代码是在完成一个电话簿的功能。在从Record Management System从入门到精通之四中我会介绍自己编写的电话本。在控制器类中最重要的就是接受事件然后进行导航,也就是显示不通的界面。因此它的事件处理的方法是这样的。

public void handleEvent( int eventID)

{

switch (eventID)

{

case EventID.ADD_NEW_RECORD:

{

display.setCurrent(newPhoneUI);

break;

}

case EventID.LIST_RECORD:

{

display.setCurrent(listPhoneUI);

break;

}

case EventID.SEARCH_RECORD:

{

display.setCurrent(searchPhoneUI);

break;

}

case EventID.EVENT_NEWPHONE_BACK_MAINUI:

{

display.setCurrent(indexFunctionUI);

break;

}

case EventID.EVENT_LISTPHONE_BACK_MAINUI:

{

display.setCurrent(indexFunctionUI);

break;

}

case EventID.EVENT_SEARCHUI_BACK_MAINNUI:

{

display.setCurrent(indexFunctionUI);

break;

}

default:

break;

}

}

public void handleEvent(int eventID, Object[] obj)

{

}这是个重载的方法,当有参数传递过来的时候我们调用后面的方法。

接下来我们看界面类,它们通常包括控制器类、界面的Item还有一些Command。

public NewPhoneUI(UIController uicontroller)

{

super(Title.add_record);

this.uicontroller = uicontroller;

nameField = new TextField(Title.name, null, 25, TextField.ANY);

mobileField = new TextField(Title.mobile, null, 25,

TextField.PHONENUMBER);

choice = new ChoiceGroup(Title.choice, ChoiceGroup.MULTIPLE);

phoneField = new TextField(Title.phone, null, 25, TextField.PHONENUMBER);

emailField = new TextField(Title.email, null, 25, TextField.EMAILADDR);

choice.append(Title.detail, null);

this.append(nameField);

this.append(mobileField);

this.append(choice);

this.addCommand(saveCommand);

this.addCommand(backCommand);

this.setCommandListener(this);

this.setItemStateListener(this);

}通常他们把控制器类作为参数传递给构造器,并在构造器内部注册监听器,绘制界面等。它们通过commandAction()方法来传递事件编号给控制器类去处理,例如

public void commandAction(Command arg0, Displayable arg1)

{

// TODO Auto-generated method stub

if (arg0 == backCommand)

{

uicontroller

.handleEvent(UIController.EventID.EVENT_NEWPHONE_BACK_MAINUI);

}

}这样就基本上完成了导航问题,扩展起来非常容易,添加一个界面类,然后在控制器类中初始化并添加适当的事件编号就可以了。

想起来,这种解决方法真是非常经典!!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有