Java MVC - 不觉得我明白了

Hen*_*sel 6 java model-view-controller design-patterns java-me

作为编程的初学者,当我遇到墙壁时,它总是让我烦恼.目前,其中一面墙是共同依赖的物体.

正如你在我的问题历史中所看到的,我正在研究一个黑莓应用程序,我在其中实现了一些我称之为MVC模式的东西,但它并不是我认为它的意思.

你看,一个新手程序员,你看这个图形的摘要,你就会明白它背后的想法.但实施它是另一回事.

alt text http://www.ibm.com/developerworks/wireless/library/wi-arch6/theoretical.gif

请不要停止阅读:)我正在向你展示我的一些代码,其中包含一些黑莓特定的东西,但你应该看看我在做什么.

我的申请的主要入口点

public class ContactManager extends UiApplication
{
    private static ContactManagerMainScreenModel MainScreenModel = new ContactManagerMainScreenModel();
    private static ContactManagerMainScreen MainScreenView = null;

    public static void main(String[] args)
    {
        new ContactManager().enterEventDispatcher();
    }
    public ContactManager()
    {   
        MainScreenView = new ContactManagerMainScreen(MainScreenModel);
        // Displays the Splashscreen then opens the Mainscreen 
        new SplashScreen(UiApplication.getUiApplication(), MainScreenView);
    }
}
Run Code Online (Sandbox Code Playgroud)

主屏模型

public class ContactManagerMainScreenModel
{
    ContactManagerMainScreen v;
    // Loading Local Storage
    LocalContactStorage LocalContactStorage = new LocalContactStorage();

    // Define Data List
    private Vector vContacts_Favorites;

    public void register(ContactManagerMainScreen v)
    {
        this.v = v;
    }
    // Retrieve Favorite Contacts from Persistant Storage
    public Vector getFavoriteContactsFromLocalStorage()
    {
        vContacts_Favorites = LocalContactStorage.getFavoriteContactsFromLocalStorage();
        return vContacts_Favorites;
    }
    // Put Retrieve Favorite Contacts from Persistant Storage
    public void saveFavoriteContactsToLocalStorage()
    {
        LocalContactStorage.saveFavoriteContactsToLocalStorage(vContacts_Favorites);
    }
}
Run Code Online (Sandbox Code Playgroud)

MainScreenController

public class ContactManagerMainScreenController 
{
    private ContactManagerMainScreenModel _model = null;
    private ContactManagerMainScreen _view = null;

    public ContactManagerMainScreenController(ContactManagerMainScreen view, ContactManagerMainScreenModel model)
    {
        this._model = model;
        this._view = view;
    }

    public void HideFavoriteList()
    {
        if( this._view._ContactList.getManager() != null)
        {
            this._view._ContactList.getManager().delete(this._view._ContactList);
        } else
        {
            this._view._bottom_box.add(this._view._ContactList);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

还在那儿?好的 ...

我的问题在于,我想使用控制器来更改UI元素,比如显示弹出框,隐藏某些内容或其他内容.

但是所有这些UI元素都在View中定义(此处为ContactManagerMainScreen),因此必须向Controller提供对View的引用.这导致我的共同依赖对象的痛苦.

在声明视图之前,我无法创建控制器.如果没有允许控制器更改UIElements的要求,则没有问题(如图中所示).

我现在正在做的是View创建了Controller

controller = new ContactManagerMainScreenController(this , model);
Run Code Online (Sandbox Code Playgroud)

这有道理吗?我想了解模式,所以调用我的代码垃圾或任何你喜欢的东西:)我只是想学点东西.

PS请原谅我的英语不好:)

Bil*_*l K 11

MVC是一个有趣的抽象,但有一些问题.

实际上,控制器和视图通常是成对的 - 即使理论上你应该能够替换任何一个而不是另一个,实际上不同视图的接口机制是如此不同,以至于控制器和视图结合在一起.

我见过的关于Java的最佳描述是视图是你的swing组件,因此你的视图代码部分只不过是将这些组件放在屏幕上.

您的控制器是该类的其余部分,监听器以及与视图交互的其余代码.

我的建议是不要过分担心隔离视图和控制器,但是说,我完全支持在模型和视图/控制器之间保持非常强大的分离.

编辑/高级:我使用了一种模式,其中控制器和视图是隔离的,它更灵活,但它往往是更多的工作.我认为Struts使用绑定模型 - 如果你想看到一些抽象技术,你可能会看到那里或搜索有关"绑定"摆动控件的东西.