`
ming_fanglin
  • 浏览: 220697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
开发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);
        }

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

      想起来,这种解决方法真是非常经典!!
分享到:
评论

相关推荐

    基于MVC模式的J2ME应用程序框架设计

    基于MVC模式的J2ME应用程序框架设计

    嵌入式系统/ARM技术中的基于MVC模式的J2ME应用程序框架设计

    1 J2ME应用程序框架的现状 Sun公司在1999年6月推出了J2ME(Java 2 MicroEdition,Java 2袖珍版)。J2ME是专门为那些使用有限电源、有限网络连接以及有限图形用户界面能力的设备开发的,满足了消费电子和嵌入式设备...

    J2ME客户端的MVC结构设计介绍

    MVC 模式提供了一种方法,将应用程序(或者应用程序的一部分)分解成三个部分:①模型,它是应用程序的主要部分,包括商业逻辑;②视图,它指明了用户接口;③控制器,其作用是处理用户输入和系统事件,将工作委派至...

    论文研究-基于MVC模式的移动设备屏幕导航系统的设计与实现 .pdf

    基于MVC模式的移动设备屏幕导航系统的设计与实现,刘伟,范博文, 通过对MVC设计模式的研究,本文为移动设备屏幕导航功能设计并实现了一个具备可扩展性的系统架构。该架构结合了MVC和J2ME技术。MVC模�

    J2ME手机备忘录源代码

    MVC模式开发的J2ME程序源代码,用RMS存储方式,支持关键字查询,日期查询等功能

    J2ME_手机电话本_增删改查|查找

    J2ME_手机电话本 实现增删改查功能 MVC设计模式 源码值得学习 PhoneBook.java是程序主入口 谢谢下载

    j2me手机开发相关源代码

    javaME 源码 包括基础知识 、Canvas、RMS 、多线程 、HTTP、Socket、Datagram、文件读写创建删除、PIM、短信彩信、MMAPI、MVC模式等等实例 ---------------以下...17设计模式 18单元测试 19"在线听歌"商务应用实例

    论文研究-基于J2ME技术的手机网络游戏研究与开发.pdf

    手机游戏开发基于J2ME技术基础,以牌类游戏为实例,采用了MVC框架模式进行设计,提高了系统的可维护性,有利于系统的二次开发;基于Java的特性使该系统具有较高的可移植性,可在主流手机平台中正常运行,减少移植...

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

Global site tag (gtag.js) - Google Analytics