代码之家  ›  专栏  ›  技术社区  ›  Crescent Fresh

MVP模式:多个演示者应该分离还是可以直接通信?

  •  4
  • Crescent Fresh  · 技术社区  · 16 年前

    我有一个像这样的用户界面:

        +--------+---------------+
        | model1 | model details |
        | model2 |     here,     |
        | model3 | loaded as the |
        |        | user selects  |
        |        | a model from  |
        |        |   the left.   |
        |        |               |
        +--------+---------------+
    

    我正在使用 MVP pattern 驱动此用户界面。

    我在这里简化了很多,但是为了划分和征服,我想将演示者分为两部分:一部分处理左侧视图中的用户手势(用户更改此视图中的模型列表,例如排序),另一部分处理右侧视图中的用户手势(用户更改此视图中的单个模型)。

    当左侧的演示者与整个模型列表交互时,右侧的演示者仅与单个模型交互:用户从左侧列表中选择的模型。从左到右驱动用户界面。

    在用户选择(即单击)左侧的模型之后,我当前的实现看起来(大致)像:

    LeftPresenter.onModelClick = function(event) {
        var model = this.getModelFromEvent(event);
        this.view.setSelectedModel(model); // updates list widget on left
        RightPresenter.setSelectedModel(model); // notify the other Presenter
    }
    
    RightPresenter.setSelectedModel = function(model) {
        // lazy load the model from the db, and update the
        // view when the model fires the "loadComplete" event
        model.bind('loadComplete', this.view.setModel);
        model.lazyLoad();
    }
    

    以下是我对MVP模式或任何MVC GUI模式进行WRT模糊处理的部分:

    1. 这样的多个演示者可以驱动一个用户界面吗?
    2. 多个演示者应该分离还是可以像这里所示直接相互通信?

    所以我的问题归结为: 最好的方法是什么 RightPresenter 用户在中选择了一个模型 LeftPresenter 的观点 ?

    1 回复  |  直到 16 年前
        1
  •  1
  •   RS Conley    16 年前

    1。一个用户界面可以由多个驱动吗? 像这样的演示者?

    是的

    2。多个演示者应该 分离或它们能通信吗 如图所示 在这里?

    我处理它的方式是我有一个这样的框架

    当事件发生时,ui_对象处理事件,创建并触发命令对象。每个ui_对象实现一个在ui_视图中找到的视图接口,并在ui_视图中注册自己。命令对象可以通过接口访问ui_视图中注册的ui对象。

    例如,在我的一个金属切割应用程序中,有一个叫做hold的屏幕元素,它包含所有尚未放置在金属板上进行切割的零件。一个零件可以通过几种方式进入货舱。从零件文件加载,由形状编辑器创建,由CAD屏幕创建,或从金属板中提取。

    这些操作中的每一个都被封装到实现命令设计模式的单独的命令对象中。当命令对象执行时,它调用。

    CuttingScreen.Refresh
    CADScreen.Refresh
    ShapeEditor.Refresh
    

    每个都将刷新相应的屏幕,更新保持。

    现在我可以向我的应用程序接口添加一个方法。myCuttingApplication.holdRefresh将依次调用这三个刷新。

    但重要的一点是,视图调用一个命令,该命令使用视图实现的接口进行更新。视图对象在较低的层中注册自己。