应该将构建器模式用作包装器吗?

本文关键字:包装 模式 构建 | 更新日期: 2023-09-27 18:11:50

尝试评估是否用构建器模式替换混乱的图表帮助器类。在helper类中有如下方法:

[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上的各种属性。这在大多数情况下都很有效,但这些方法并不总是适用于所有可能的图表类型(条形图、线形图、饼形图等),而且有时图表的外观会偏离这些辅助方法的不同"配置"。与其尝试使用helper类来满足这些不同的"配置",我更想知道构建器模式。

根据我的理解,构建器模式是用来构造复杂对象的。在我的例子中,我已经创建了复杂的对象(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();
    }
}

具体的构建器:

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并没有创建一个新的对象,它只是修改了一个已经存在的对象的属性。

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

应该将构建器模式用作包装器吗?

好吧,在我看来,如果你确信任何图表在你的应用程序可以操纵(叫它配置,如果你愿意)与这个或其他但唯一的方法或属性集,你可以切换到Builder模式。问题是你的短语

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

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