Ruby 露比:带装饰的冰淇淋

Ruby 露比:带装饰的冰淇淋,ruby,Ruby,我正在写一个简单的程序来计算冰淇淋的价格 过程非常简单:挑选一个蛋筒,挑选一些口味,挑选一些配料,然后支付金额 有一堆不同的甜筒,一堆不同的口味,还有一堆不同的配料 我的设计是使用decorator类来包装冰淇淋,类似于您下订单的方式 因此,我有一个基本的冰激凌类,它提供了一个“amount”属性,指示这个东西的成本,还有用于蛋卷、味道和配料的装饰类。每个类将获取一个冰激凌对象并添加到数量中,因此基本上可以混合和匹配不同类型的冰激凌 我有另一个类处理实际的货币交易,它接受各种对象并计算价格。特别

我正在写一个简单的程序来计算冰淇淋的价格

过程非常简单:挑选一个蛋筒,挑选一些口味,挑选一些配料,然后支付金额

有一堆不同的甜筒,一堆不同的口味,还有一堆不同的配料

我的设计是使用decorator类来包装冰淇淋,类似于您下订单的方式

因此,我有一个基本的冰激凌类,它提供了一个“amount”属性,指示这个东西的成本,还有用于蛋卷、味道和配料的装饰类。每个类将获取一个冰激凌对象并添加到数量中,因此基本上可以混合和匹配不同类型的冰激凌

我有另一个类处理实际的货币交易,它接受各种对象并计算价格。特别是,如果它看到一个冰淇淋,它会执行一些与冰淇淋相关的过程

现在,这个设计听起来很好,但我如何检查从冰淇淋机出来的对象是否是冰淇淋类型?毕竟,从理论上讲,它将被一群装饰师所包围,所以如果你要上它的课,你可能会看到像浇头之类的东西,而不仅仅是冰淇淋。冰淇淋也不一定是上等货;它可能是层次结构中的几个类

.Instanceof(冰淇淋)
似乎不起作用


此外,我还使用一组类实现了它。ruby中还有其他方法可以用来实现这种类型的设计吗?

您应该向我们展示一些代码,但是ruby有
对象#is#a?
类#===
,这在这里很有帮助:

class MyString < String ; end
MyString.new.is_a? String #=> true
String === MyString.new #=> true
class AnotherString < MyString ; end
AnotherString.new.is_a? String #=> true
String === AnotherString.new #=> true
对于更惯用的设计方法,您可能应该研究模块及其作为混合模块的使用:

case value
when String
  # something
when Array
  # something else
end