0

我正在尝试使用装饰器模式方法来解决这个问题。我用这个这个作为参考。我试图总结适用于我创建的项目的税,但我只能获得最后一个未包装对象应用的税。

module SalesTaxDeco

  class Item

    attr_accessor :price

    def initialize(price)
      @price = price
    end

    def sales_tax
    end

  end

  class SalesTax

    def price
      @component.price
    end

    def initialize(component)
      @component = component
    end

    def sales_tax
      ((@component.price * 0.10)*(1/0.05).ceil)/(1/0.05)
    end
  end

  class ImportDuty

    def price
      @component.price
    end

    def initialize(component)
      @component = component
    end

    def sales_tax
      ((@component.price * 0.5)*(1/0.05).ceil)/(1/0.05)
    end
  end
end

我创建了一个项目

def test_imported_perfume_is_taxed
    item = Item.new 47.50
    assert_equal 7.15, SalesTax.new(ImportDuty.new(item)).sales_tax
end

但我只得到 4.75 作为答案。是什么赋予了?我哪里错了?

谢谢。

4

1 回答 1

2

ImportDuty#sales_tax不调用,因为SalesTax不调用底层组件的 sales_tax 方法。

尝试以下操作:

class Item
  ....
  def sales_tax
    0
  end
end

class SalesTax
  ...
  def sales_tax
    @component.sales_tax + ((@component.price * 0.10)*(1/0.05).ceil)/(1/0.05)
  end
end

class ImportDuty
  ...
  def sales_tax
    @component.sales_tax + ((@component.price * 0.05)*(1/0.05).ceil)/(1/0.05)
  end
end

使用上面的代码,SalesTax.new(ImportDuty.new(Item.new 47.50)).sales_tax产生7.125.

于 2013-08-30T06:43:31.260 回答