【问题标题】:Builder Design Pattern : Accessing/Passing model data to/in Concrete classes构建器设计模式:访问/传递模型数据到/在具体类中
【发布时间】:2015-08-22 18:17:43
【问题描述】:

这是我的构建器界面:

public interface IContainerBuilder {
  void SetSections();
  void SetSides();
  void SetArea();
  WebControl GetContainer();
}

这是我的 ConcreteBuilder:

public class SingleContainerBuilder:BaseProperties, IContainerBuilder {
  Panel panel = new Panel();
  public void SetSections() {
    //panel.Height = value coming from model
    //panel.Width = value coming from model
  }
  public void SetSides() {
    //panel.someproperty = //value coming from model,
    //panel.someotherproperty = //value coming from model,
  }
  public void SetArea() {
    throw new NotImplementedException();
  }
  public System.Web.UI.WebControls.WebControl GetContainer() {
    return panel;
  }
}

导演来了:

public class ContainerBuilder {
  private readonly IContainerBuilder objBuilder;
  public Builder(IContainerBuilder conBuilder) {
    objBuilder = conBuilder;
  }
  public void BuildContainer() {
    objBuilder.SetArea();
    objBuilder.SetSections();
    objBuilder.SetSides();
  }
  public WebControl GetContainer() {
    return this.objBuilder.GetContainer();
  }
}

这就是我从默认页面调用它的方式:

var conBuilder = new ContainerBuilder(new SingleContainerBuilder());
conBuilder.BuildContainer();
var container = conBuilder.GetContainer();

现在我遇到的问题/困惑是如何将模型数据传递给具体的类?我感到困惑/卡住的原因是可能有许多不同的容器(可能超过 20-30 个)。每种不同类型的容器都必须从模型中获取数据还是有更好的方法?

我感到困惑的第二件事是,我的模型在不同的库中。我是否需要在我的 Web 项目中创建模型的副本并从该主模型填充我的本地模型,还是应该直接查询主模型的具体类属性?如您所见,我的 SingleContainer 包含 BaseProperties,它们是主模型中已经存在的属性的本地声明。我没有看到或理解本地模型的意义,我不确定我是否在这里。

对不起,我是设计模式的新手。

任何帮助将不胜感激,

谢谢

【问题讨论】:

    标签: c# asp.net design-patterns


    【解决方案1】:

    我创建了一个在构建器初始化之前调用的库,我将我需要的容器的“密钥”发送到库静态方法,库根据“密钥”返回我需要的数据和然后我将该对象传递给构建器并在那里做一些事情。早些时候我必须传递多个对象来构建需要构建的东西,但现在不是将多个“数据对象”传递给具体类并使具体类依赖于其他类,具体类只需要一个包含所有信息的“数据对象”我需要。

    所以我的电话现在看起来像这样

    var data = ContainerData.Getdata(key);//Call to library 
    

    然后对 builder 的最终调用是

    var conBuilder = new ContainerBuilder(new SingleContainerBuilder(data));
    

    当然具体类的构造函数已经改为接受'data'类型

    【讨论】:

      【解决方案2】:

      @每种不同类型的容器都必须从模型中获取数据还是有更好的方法?

      就像 GOF 书中描述的那样,这将是一个可靠的解决方案。因此,对于每种不同的类型,您都有自己的具体类型的构建器。

      解决方法可以是提供模型的规范,以便您可以为一组模型使用构建器。请注意:通过这种方式模型需要了解构建者,这不是一种干净的方式!

      @每种不同类型的容器都必须从模型中获取数据还是有更好的方法?

      在任何情况下,容器都不应该直接知道模型。建造者应该这样做。这就是建造者模式的意义所在。所以构建者应该知道如何从模型中获取数据。在他被要求构建零件的情况下收集数据。

      构建器模式意图的第一部分: “将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示”

      @我是否需要在我的 Web 项目中创建模型的副本并从该主模型填充我的本地模型,还是应该直接查询主模型的具体类属性? p>

      我不参与您的项目,但我认为您不应该构建通常容易出错的主数据副本。因此,建设者应该有可能超出需要的数据。

      【讨论】:

      • 感谢@ratnim 的回答。我同意模型部分。实际上,我遵循了这里讨论的想法link。到目前为止,遵循“数据对象”的想法对我来说似乎是可行的解决方案。但是,如果有任何经验丰富的大师正在使用任何更好的方法并可以指导我,我会保持这个问题的开放
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2015-02-27
      相关资源
      最近更新 更多