Ruby:带装饰的冰淇淋

时间:2012-05-04 18:14:20

标签: ruby

我正在编写一个计算冰淇淋成本的简单程序。

这个过程非常简单:选择一个圆锥,挑选一些口味,挑选一些浇头,然后支付金额。

有许多不同的锥体,一堆不同的口味,还有一堆不同的配料。

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

所以我有我的基础冰淇淋类,它提供了一个“数量”属性,表明物品的成本,以及Cone,Flavor和Toppings的装饰器类。每个班级都会拿一个冰淇淋对象加上量,所以你基本上混合搭配不同类型的冰淇淋。

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

现在,这个设计听起来不错,但是如何检查冰淇淋制造商出来的物品是否是冰淇淋类型?毕竟,它理论上会被一堆装饰者包裹着,所以如果你要求它的类,你可能会看到像Topping而不仅仅是冰淇淋。超级冰淇淋也不是必需的;它可能是层次结构中的几个类。

<topping ice cream>.Instanceof(Ice_Cream)似乎不起作用。

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

1 个答案:

答案 0 :(得分:1)

你应该向我们展示一些代码,但Ruby有Object#is_a?Class#===在这里可以提供帮助:

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

如果你想知道Class#===,它主要用于案例陈述:

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

对于更多惯用设计方法,您可能应该研究模块及其作为mixins的用途:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html