裝飾圖案

裝飾器模式為物件新增行為,而不會影響同一類的其他物件。裝飾器模式是建立子類的有用替代方法。

為每個裝飾器建立一個模組。這種方法比繼承更靈活,因為你可以在更多組合中混合和匹配職責。此外,由於透明度允許裝飾器以遞迴方式巢狀,因此它允許無限數量的責任。

假設 Pizza 類有一個返回 300 的成本方法:

class Pizza
  def cost
    300
  end
end

代表披薩加上一層乳酪爆裂,成本上升 50 倍。最簡單的方法是建立一個 PizzaWithCheese 子類,在成本方法中返回 350。

class PizzaWithCheese < Pizza
  def cost
    350
  end
end

接下來,我們需要代表一個大披薩,它可以增加普通披薩的成本。我們可以使用 Pizza 的 LargePizza 子類來表示這一點。

class LargePizza < Pizza
  def cost
    400
  end
end

我們還可以使用 ExtraLargePizza,為 LargePizza 增加 15 美元。如果我們考慮這些披薩型別可以配上乳酪,我們需要新增 LargePizzaWithChese 和 ExtraLargePizzaWithCheese 子類。我們最終總共有 6 個類。

要簡化方法,請使用模組向 Pizza 類動態新增行為:

模組+擴充套件+超級裝飾: - >

class Pizza
  def cost
    300
  end
end

module CheesePizza
  def cost
    super + 50
  end
end

module LargePizza
  def cost
    super + 100
  end
end

pizza = Pizza.new         #=> cost = 300
pizza.extend(CheesePizza) #=> cost = 350
pizza.extend(LargePizza)  #=> cost = 450
pizza.cost                #=> cost = 450