草庐IT

Java MVC - 感觉我不明白

coder 2024-03-25 原文

作为编程的初学者,当我遇到墙壁时,它总是让我烦恼。 目前其中一堵墙是相互依存的对象。

正如您在我的问题历史记录中看到的那样,我目前正在开发一个黑莓应用程序,我在其中实现了一个我称之为 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);
    }
}

主屏幕模型

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);
    }
}

主屏幕 Controller

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);
        }
    }
}

还在吗?好的……

我的问题是,我想使用 Controller 来更改 UI 元素,例如显示弹出框、隐藏某些内容或其他内容。

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

我无法在声明 View 之前创建 Controller 。如果不需要允许 Controller 更改 UIElements,那将是没有问题的(如图所示)。

我现在做的是View创建Controller

controller = new ContactManagerMainScreenController(this , model);

这有意义吗?我想了解这种模式,所以称我的代码为垃圾或任何你喜欢的东西:)我只是想学习一些东西。

附言请原谅我的英语不好:)

最佳答案

MVC 是一个有趣的抽象,但存在一些问题。

在现实中, Controller 和 View 通常是配对的——尽管理论上您应该能够在没有另一个的情况下替换其中一个,但实际上不同 View 的接口(interface)机制是如此不同,以至于 Controller 和 View 是结合在一起的。

我见过的关于 Java 的最好描述是 View 是您的 swing 组件,因此您的 View 代码部分只是将这些组件放在屏幕上。

您的 Controller 是该类的其余部分、监听器以及与 View 交互的其余代码。

我的建议是不要太担心隔离 View 和 Controller ,但话虽如此,我完全支持在模型和 View / Controller 之间保持非常牢固的分离。

编辑/高级: 我使用了一种模式,其中 Controller 和 View 是隔离的,它更灵活,但往往需要更多的工作。我认为 Struts 使用绑定(bind)模型——如果您想了解一些抽象技术,您可以去那里看看或搜索有关“绑定(bind)”swing 控件的内容。

关于Java MVC - 感觉我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120334/

有关Java MVC - 感觉我不明白的更多相关文章

  1. ruby - 是什么触发了关于第一个参数不明确的 Ruby 警告? - 2

    在Ruby1.9.1中,如果你这样做$VERBOSE=trueputs/m/,42.to_s或者如果我这样做$VERBOSE=trueputs/m/,"42"你收到警告warning:ambiguousfirstargument;putparenthesesorevenspaces但我不明白$VERBOSE=trueputs"m",42.to_s或$VERBOSE=trueputs(/m/,42.to_s)那么具体是什么触发了这个警告?我还可以在原始表达式中添加哪些空格? 最佳答案 “问题”是/可以表示除法或正则表达式。该消息是通用

  2. ruby-on-rails - Rails ActiveRecord:PG::错误:错误:列引用 "created_at"不明确 - 2

    我正在努力解决对象中的错误,但完全不确定问题出在哪里。这是模型的样子:classCar:car_colorsendclassCarColor:car_colorsend这里是查询:@cars=Car.all(:joins=>:car_colors,:conditions=>{:car_colors=>{:color_id=>params[:id_number]}},:order=>"cars.created_atDESC")错误输出:PG::Error:ERROR:columnreference"created_at"isambiguousLINE1:...d"WHERE"car_co

  3. ruby - 是否有教程教授经验丰富的程序员使用的常见 Ruby 编程习语,但对新手来说可能并不明显? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我正在寻找Ruby的CodeLikeaPythonista:IdiomaticPython等价物理想的特性:易于阅读涵盖所有主题的单一文档:提示、技巧、指南、注意事项和陷阱比一本书还小惯用语应该在标准发行版中开箱即用(%sudoapt-getinstallruby​​irbrdoc)请尽可能为每个答案放一个教程,并附上教程中的示例代码及其含义。更新:这些

  4. ruby - 我不明白 ruby 本地范围 - 2

    在这个例子中,deffoo(x)if(x>5)bar=100endputsbarend然后foo(6)输出:100而foo(3)什么也不输出。但是,如果我将定义更改为deffoo(x)if(x>5)bar=100endputsbobend我收到“未定义的局部变量或方法”错误。所以我的问题是为什么当我调用foo(3)并且从未设置bar时我没有收到此错误? 最佳答案 这里发生了几件事。首先,在ifblock内声明的变量与在方法的顶层声明的变量具有相同的局部作用域,这就是为什么bar在if之外可用的原因。其次,您收到该错误是因为bob被突

  5. javascript - 不明白这是如何调用 Jquery 中的 fadeIn 方法的 - 2

    我正在使用的插件中有一行我试图理解:$self.hide().attr("src",$self.data(settings.data_attribute))[settings.effect](settings.effect_speed);self是一个jquery对象,在这段代码中是一个imgdom元素,它隐藏了它,然后将这个img对象的src属性设置为html5的data-attribute。但现在它访问.attr(返回的jquery对象中的一个属性,在这个中是“淡入”。但我不明白,jquery对象是否具有内置在jquery对象中内置效果属性函数的地方?我很困惑这是如何转换为调用.f

  6. javascript - 最后一段 javascript 闭包我还是不明白 - 2

    假设我们已经在全局范围内定义了这个函数:functioncreateCounter(){varcounter=0;functionincrement(){counter=counter+1;console.log("Numberofevents:"+counter);}returnincrement;}在大多数解释闭包的例子中,我看到执行:createCounter();从全局范围只会返回内部函数:functionincrement(){counter=counter+1;console.log("Numberofevents:"+counter);}现在完全有道理了,因为create

  7. javascript - 不明白为什么这段代码有效 - 2

    如果用户的浏览器是IE,并且localStorage不存在,下面的代码设置一个localStorage,它的有效期为24小时。(functionieAlert(){varlastclear=window.localStorage.getItem('myLocalStorage'),time_now=(newDate()).getTime();varisIE=document.documentModeif(isIE&&!lastclear){if((time_now-lastclear)>1000*60*60*24){window.localStorage.clear()window.l

  8. javascript - 我不明白这个闭包的例子 - 2

    Crockford有这个例子来防止myArray在全局范围内:varmyName=(function(){varmyArray=['zero','one','two','three','four'];returnfunction(X){returnmyArray[X];}}());//Thisfunctionisinvokedimmediatelyresult=myName(3);//Nowinvokeit"forreal"问:我不明白为什么不是varmyName=(function(X){问:当我调用myName(3)时,"varmyArray="不是执行了第二次吗?假设它没有第二次

  9. javascript - 我不明白这段代码 - 2

    我不明白这段代码:functionms(){varplc=unescape('".unescape('\x43\x43\x43\x43\n.............\xEF'.$URL).CollectGarbage();if(mf)return(0);mf=1;varhsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38);varss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs;for(i=0;i在上面的函数中,我似乎无法弄清楚变量类型,或者弄清楚它对hsta变量做了什么,以及它分配给

  10. go - 我不明白代码 : result = quote123(func(x int) string { return fmt. Sprintf ("%b", x) }) - 2

    我正在学习golang,对于将一个函数作为参数传递给另一个函数的代码,我不知道我列出的代码的含义对于quote123函数,它需要一个函数作为参数,如何将部分:func(xint)string{returnfmt.Sprintf("%b",x)}传递给quote123函数,即使这样有效,如果那部分返回一个字符串,这个字符串不应该是函数quote123的参数//converttypestakeanintandreturnastringvalue.typeconvertfunc(int)string//valueimplementsconvert,returningxasstring.fun

随机推荐