---
# System prepended metadata

title: Decorator Pattern

---

# Decorator Pattern
* 需求：飲料店內有紅茶/奶茶/綠茶
* 解決辦法：繼承/模組
* 造成問題？

Decorator Pattern概念：
裝飾模式是一種結構型設計模式， 允許你通過將對象放入包含行為的特殊封裝對像中來為原對象綁定新的行為。

---
![](https://i.imgur.com/q7uUT1a.png)

```ruby=

class DrinkShop

  def make
    raise NotImplementedError, "#{self.class} has not implemented method '#{__method__}'"
  end

end

class BlackTea < DrinkShop

  def make
    "紅茶"
  end
  
  def calculate
    price = 25
  end

end

class GreenTea < DrinkShop

  def make
    "綠茶"
  end
  
  def calculate
    price = 20
  end

end

class Ingredients < DrinkShop
  attr_accessor :component

  def initialize(component)
    @component = component
  end

  def make
    @component.make
  end

  def calculate
    @component.calculate
  end

end

class TapiocaBall < Ingredients

  def make
    "珍珠+#{@component.make}"
  end

  def calculate
    @component.calculate + 5
  end

end

class KonjacJelly < Ingredients

  def make
    "寒天+#{@component.make}"
  end

  def calculate
    @component.calculate + 8
  end

end

class CoconutJelly < Ingredients

  def make
    "椰果+#{@component.make}"
  end

  def calculate
    @component.calculate + 7
  end
  
end


black_tea = BlackTea.new
black_tea_T = TapiocaBall.new(black_tea)
black_tea_D_T=TapiocaBall.new(black_tea_T)
black_tea_T_K = KonjacJelly.new(black_tea_T)
black_tea_T_K_C = CoconutJelly.new(black_tea_T_K)
green_tea = GreenTea.new
green_tea_T = TapiocaBall.new(green_tea)

puts "紅茶：#{black_tea.make}，價格#{black_tea.calculate}"
puts "珍珠加紅茶：#{black_tea_T.make}，價格：#{black_tea_T.calculate}"
puts "雙倍珍珠加紅茶：#{black_tea_D_T.make}，價格#{black_tea_D_T.calculate}"
puts "珍珠加寒天加椰果紅茶：#{black_tea_T_K_C.make}，價格#{black_tea_T_K_C.calculate}"
puts "------------------------------------------------------------------------"
puts "綠茶：#{green_tea.make}，價格#{green_tea.calculate}"
puts "珍珠加綠茶：#{green_tea_T.make}，價格：#{green_tea_T.calculate}"
```

[額外補充](https://ithelp.ithome.com.tw/articles/10218692)
