构建器设计模式:访问/传递模型数据到/在具体类中

时间:2015-08-22 18:17:43

标签: c# asp.net design-patterns

这是我的构建器界面:

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,它是已在主模型中的属性的本地声明。我没有看到或理解当地模特的观点,我不确定我是不是在这里。

对不起,我是Design Patterns的新手。

任何帮助都会非常感激,

由于

2 个答案:

答案 0 :(得分:2)

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

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

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

然后对构建器的最后调用是

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

当然,具体类的构造函数已被更改为接受“数据”类型

答案 1 :(得分:0)

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

与所描述的GOF书中一样,这将是一个解决方案。因此,您可以为每种不同类型提供自己的具体类型的构建器。

解决方法可以是从模型中提供规范,以便您可以将构建器用于一组模型。请注意:通过这种方式,模型需要知道建筑商,这不是一个干净的方式!

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

在任何情况下,容器都不应该直接知道模型。建设者应该这样做。那就是建筑师帕特恩的意思。因此构建器应该知道如何从模型中获取数据。在调用它来构建零件的情况下收集数据。

构建器模式的第一部分意图: "从其表示中分离出一个复杂对象的构造,以便相同的构造过程可以创建不同的表示"

@Do我需要在我的web项目中创建模型的副本并从该主模型填充我的本地模型,还是应该直接查询Master Model for Concrete Class Properties?

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