【问题标题】:Should Builder Pattern be used as a wrapper?Builder Pattern 应该用作包装器吗?
【发布时间】:2011-10-18 18:03:57
【问题描述】:

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

[图表助手]

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();
    }
}

混凝土生成器:

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 类,即使这不是构建器模式的纯粹实现?

【问题讨论】:

    标签: c# design-patterns refactoring


    【解决方案1】:

    好吧,在我看来,如果您确定您的应用程序中的任何图表都可以使用这个或其他独特的方法或属性集进行操作(如果您愿意,可以将其称为已配置)可以切换到Builder模式。问题是你的短语不是很清楚

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

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

    【讨论】:

    • 这种上下文中的配置仅仅意味着抽象类的不同实现。例如,如果在一种情况下,不是让边框不可见,而是有时需要让它可见。我想如果一个抽象类还不够,可以使用抽象工厂模式。然而,这个想法是限制给定图表类型(条形图、饼图)的“标准”数量。辅助类也可以做到这一点,方法是在每个辅助方法中使用 switch、if 等,但这看起来很混乱。
    • @subt13:这实际上是我的疑问,如果这个类足够了(因为不能从问题中弄清楚)。此时,Builder 是您的选择。
    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 2010-11-29
    • 2019-06-04
    • 2014-08-09
    • 1970-01-01
    • 2019-10-15
    • 2014-10-18
    • 2018-09-14
    相关资源
    最近更新 更多