2008-11-13 21 views
4

我正在构建一个与购物车非常相似的应用程序。用户从列表中选择产品,然后基于该产品,需要设置和保存一些属性。我可以使用什么架构来处理购物车,其中每个产品的requries都需要保存不同的属性

例子。

如果用户选择了允许自定义颜色匹配的颜色类型,那么我必须允许他们输入通过颜色匹配过程收到的公式编号。所以我有一个产品的Order Detail项目是一种Pa​​int类型,并且该Sku具有“AllowsCustomColorMatch”的属性,但是我还需要在某处存储公式编号。

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

回答

5

你可以有一个产品类产品属性的集合

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

    } 

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

2

我会避免为每个产品制作一个类。您的每个产品都是相同产品类别的实例

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

0

根据你当前的对象设置,我会创建2个Paint类,第一个Paint类获得所有的常见属性/字段然后创建第二个类,我们称之为PaintSpecialize,PaintSpecialize将继承Paint(给这个类所有Paint的属性和方法),然后在PaintSpecialize中添加Formula属性到类中,之后,这只是铸造物体的问题。 C#ex:

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。

所以如果客户想要定期绘画,创建一个绘画对象,如果他想要一个自定义绘画,创建一个PaintSpecialize。如果客户想要定期和定制油漆,请创建其中一个。直到你需要使用PaintSpecialize类中的某些东西时,将它们都称为Paint。

请注意,AllowsCustomColorMatch属性应该在基类中设置,否则您可能必须更加努力地弄清楚该类是否为PaintSpecialize类型。

0

由于您正在研究优雅的解决方案,因此您可能需要查看自适应对象模型体系结构样式。您可以搜索herehere。基本上,您的问题可以通过简单地使用TypeSquare模式来解决,也可以使用业务规则的解释器模式(如果它得到那么复杂的话)。

+0

我同意雨果。 – 2009-06-08 21:56:26

相关问题