【问题标题】:What architecture can I use to handle a shopping cart where each product requries different attributes to be saved我可以使用什么架构来处理每个产品需要保存不同属性的购物车
【发布时间】:2010-09-22 04:09:42
【问题描述】:

我正在构建一个与购物车非常相似的应用程序。用户从列表中选择一个产品,然后基于该产品,需要设置和保存一些属性。

示例。

如果用户选择允许自定义颜色匹配的涂料类型,那么我必须允许他们输入他们通过颜色匹配过程收到的配方编号。所以我有一个产品的订单详细信息项目,它是一种油漆类型,并且该 sku 具有“AllowsCustomColorMatch”属性,但我还需要将公式编号存储在某处。

我不确定如何在我的代码中优雅地处理这个问题。我应该创建子类还是产品?现在,我将用户输入的数据保存在 OrderDetails 对象中,该对象引用了与之关联的 Product。

【问题讨论】:

    标签: design-patterns architecture


    【解决方案1】:

    由于您正在寻找一个优雅的解决方案,您可能想看看自适应对象模型架构风格。您可以搜索herehere。基本上,您的问题可以通过简单地使用 TypeSquare 模式来解决,也许还有业务规则的解释器模式(如果它变得那么复杂的话)。

    【讨论】:

      【解决方案2】:

      取决于您如何设置当前对象;我会创建 2 个 Paint 类。第一个 Paint 类采用paint 中的所有常见属性/字段。然后我会创建第二个类,我们称之为 PaintSpecialize。 PaintSpecialize 将继承自 Paint(为此类提供所有 Paint 的属性和方法)。然后,在 PaintSpecialize 中,您可以将 Formula 属性添加到类中。之后,这只是铸造对象的问题。 C# 示例:

      public class Paint {
      private decimal _price;
      private bool _allowFormula;
      
      public Paint() { ... }
      public Paint(int price) {
         _price = price;
      }
      public ChangePrice(decimal p) {
            _price = p;
         }
      }
      

      等等。

      PaintSpecialize 看起来像这样:

      public class PaintSpecialize : Paint {
      string _formula;
      [...]
      public PaintSpecialize(int price, string formula) : base(price) {
         _formula=formula;
      }
      

      在代码之后可以:

      PaintSpecialize ps  = new PaintSpecialize(15.00, "FormulaXXYY");
      ps.ChangePrice(12.00);
      List<Paint> plist = new List<Paint>();
      plist.Add((Paint)ps);
      foreach(Paint p in plist) {
      if(p.AllowFormula) {
        PaintSpecialize tmp = (PaintSpecialize)p;
        MessageBox.Show(tmp._formula);
      }
      

      上面的代码简单(但不是很完整)看看你可以用绘画做什么。该列表现在可以同时包含 Paint 和 PaintSpecialize,只要后者正确转换即可。您可以随时简单地操作列表中的 PaintSpecialize,方法是将其从简单的 Paint 转换为 PaintSpecialize。

      因此,如果客户想要常规绘画,请创建一个 Paint 对象,如果他想要自定义绘画,请创建一个 PaintSpecialize。如果客户想要一种常规和定制的油漆,请创建每种油漆。将它们都称为 Paint,直到您需要使用 PaintSpecialize 类中的某些内容。

      请注意,应在基类中设置 AllowsCustomColorMatch 属性,否则您可能需要更加努力地确定该类是否属于 PaintSpecialize 类型。

      【讨论】:

        【解决方案3】:

        我会避免为每个产品创建一个类。您的每个产品都是同一产品类的实例

        有了这样的可变属性,字典方法(基本上是键值对的映射,无论类型是否特定,都是保持设计灵活性的好方法。您不是在谈论 amazon.com 大小的产品库存,所以我认为这是一个足够好的设计来满足你需要的性能。

        【讨论】:

          【解决方案4】:

          您可以拥有一个包含产品属性集合的 Product 类

              public class Product
              {
                  private Dictionary<string, string> properties;
          
                  /// <summary>
                  /// Gets or sets the name.
                  /// </summary>
                  /// <value>The name.</value>
                  public string Name
                  {
                      get;
                      set;
                  }
          
                  /// <summary>
                  /// Gets or sets the price.
                  /// </summary>
                  /// <value>The price.</value>
                  public double Price
                  {
                      get;
                      set;
                  }
          
                  public Dictionary<string, string> Properties
                  {
                      get;
                  }
          
                  public Product()
                  {
                      properties = new Dictionary<string, string>();
                  }
          
              }
          

          在数据源中,您可以拥有一个定义每种产品类型的属性的表。然后,当您渲染页面时,您就知道要显示哪些属性以及要在字典中给出的名称。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-03
            • 2020-01-03
            • 2013-01-20
            • 2021-12-06
            • 2016-04-03
            • 2011-10-14
            相关资源
            最近更新 更多