MVP:其他构造函数的参数比视图和模型?

时间:2009-07-13 23:42:15

标签: delphi design-patterns dependency-injection mvp

我正在尝试使用Delphi 2009实现轻量级mvp框架。

视图是被动的,但支持数据绑定(通过接口属性)。

我正面临困境: 我有几个非常相似的观点/演示者/模型三元组,即:

订单表单和客户表单=行为和逻辑是相同的,但数据绑定的数据源不同,表单标题也是如此。数据源是我所有模型的公共属性所以这不是问题,设置表单标题,我不得不在我的演示者InitView方法中对其进行硬编码

一切都很好,但我的情况是我有几个非常相似的简单mvp三元组。我想重构它,但在这种情况下,我将不得不将一些参数传递给mvp构造函数。

到目前为止,我这样做:

  1. 创建视图
  2. 创建模型
  3. 创建演示者并在构造函数中注入模型和视图
  4. 事实上,我正面临一个选择:

    1. 拥有一些非常通用的视图/演示者,使用它们,但在构造函数中注入1或2个参数
    2. 让一些视图/演示者超类,并从中获取所有类似的视图/演示者,并在重写方法中设置一些特定值。
    3. 你能给我一些提示/建议吗?

      (对不起,如果我不是很清楚)

3 个答案:

答案 0 :(得分:1)

弗雷德,

我会选择1& 2以一种具有抽象视图/演示者的方式,该视图/演示者包含通用行为并创建抽象函数,这些函数可能是子类实现的特定行为。

例如,

  public abstract class AbstractPresenter{
      // subclass will be implemented 
      public abstract void InitView(Model model, View view);
  }

然后你可能有了sublcasses,OrderFormPresenter和CustomerFormPresneter从AbstractPresenter扩展而来。

public OrderFormPresenter extends AbstractPresenter{
    public void InitView(Model model, View, view){
      // do something specific values 
    }
}

public CustomerFormPresenter extends AbstractPresenter{
    public void InitView(Model model, View, view){
      // do something specific values 
    }
}

如果方向错误,请纠正我。 我希望它有所帮助。

答案 1 :(得分:1)

我只在需要时创建一个带参数和子类的通用视图/演示者。

答案 2 :(得分:1)

另一种方法(以及我曾经解决过这个问题以便它运行得很好的方法)是在模型中构建一个通用的“元数据”接口,然后视图(接口或通过类继承)使用这些通用演示者中的界面。我选择为我的模型使用继承,并为我的视图使用接口(更容易在现有表单上打一个接口,而不是需要整个板上的表单/帧继承)。在我的解决方案中,演示者的构造函数采用了3个参数,模型,视图和“MVP名称”。我使用MVP的名称来加载特定于当前场景的设置。