Builder Builder Pattern应该用作包装吗?

时间:2011-10-18 18:03:57

标签: c# design-patterns refactoring

尝试评估是否用构建器模式替换杂乱的图表助手类。在辅助类中有以下方法:

[ChartHelper]

public static ChartTitle CreateStandardChartTitle(string titleText){}
public static void SetBarWidths( BarSeriesView bars ){}
public static void SetHorizontalChartHeight( WebChartControl chart, 
    int seriesCount, int margin ){}
public static void SetVerticalChartWidth( WebChartControl chart, 
    int seriesCount, int margin ){}
public static Legend SetStandardLegendProperties(WebChartControl chart){}

显然,这些方法修改现有对象,只是修改WebChartControl上的各种属性。这对于大多数情况都非常有用,但这些方法并不总是适用于所有可能的图表类型(条形图,直线图,饼图等),并且有时候图表看起来与这些帮助程序有所不同的“配置”方法。 我没有尝试使用帮助程序类来满足这些不同的“配置”,而是想知道构建器模式。

据我所知,构建器模式用于构造复杂对象。就我而言,我已经创建了复杂的对象(WebChartControl)。所以,如果我要使用构建器模式,它将只是包装而不是创建WebChartControl。

我把一些代码从我想象中抛出来了:

导演:

public class ChartDirector
{
    private WebChartControl chart;
    public ChartDirector(WebChartControl chart)
    {
        this.chart = chart;
    }
    private StandardChartBuilder standardBuilder;
    public void Construct(StandardChartBuilder standardBuilder)
    {
        this.standardBuilder = standardBuilder;
        this.standardBuilder.Chart = this.chart;
        this.standardBuilder.BuildBorderOptions();
        this.standardBuilder.BuildPalette();
        this.standardBuilder.BuildLegend();
        this.standardBuilder.BuildSeriesLabel();
    }
}

Concrete Builder:

public class BarChartBuilder : StandardChartBuilder
{
    public WebChartControl Chart { get; set; }

    public BarChartBuilder()
        : base(ChartType.Bar)
    {

    }
    public override void BuildBorderOptions()
    {
        Chart.BorderOptions.Visible = false;
    }
   ...
}

抽象构建器,允许不同的配置......:

public abstract class StandardChartBuilder
{
    public WebChartControl Chart { get; set; }

    public StandardChartBuilder(ChartType chartType){}

    public abstract void BuildSeriesLabel();       
    public abstract void BuildBorderOptions();
    public abstract void BuildPalette();
    public abstract Legend BuildLegend();
}

从上面的代码中可以看出,ChartDirector没有创建 new 对象,它只是修改正在被包装的现有对象的属性。

所以,我的问题仍然存在,我应该用构建器模式替换ChartHelper类,即使这不是构建器模式的纯实现吗?

1 个答案:

答案 0 :(得分:1)

嗯,在我看来,如果你确定可以使用这个或其他唯一的方法或属性来操纵你的应用程序中的任何图表(如果你愿意,可以调用它)可以切换到Builder模式。问题是你的短语

还不是很清楚
  

而不是试图满足这些不同的配置

可以适合单个抽象StandardChartBuilder类提供的方法和属性的域。如果,是的,Builder绝对是一个选择。