裝飾圖案
裝飾器模式為物件新增行為,而不會影響同一類的其他物件。裝飾器模式是建立子類的有用替代方法。
為每個裝飾器建立一個模組。這種方法比繼承更靈活,因為你可以在更多組合中混合和匹配職責。此外,由於透明度允許裝飾器以遞迴方式巢狀,因此它允許無限數量的責任。
假設 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