Decorator pattern Ruby


ในการเขียนโปรเเกรมเชิงวัตถุ decorator pattern เป็น design pattern ที่ช่วยให้พฤติกรรมที่จะเพิ่มในแต่ละ วัตถุ ทั้งแบบคงที่หรือแบบไดนามิกโดยไม่มีผลต่อการทำงานของวัตถุอื่นๆ จาก class เดียวกัน

Stucture

400px-Decorator_UML_class_diagram.svg

  • Component  กำหนดการทำงานสำหรับวัตถุที่สามารถเพิ่มให้หน้าที่การทำงานได้แบบไดนามิก
  • ConcreteComponent  สามารถเพิ่มการทำงานสำหรับวัตถุ  ที่สืบทอดมาจาก Component
  • Decorator เป็น Class ที่สืบทอดมาจาก Component และภายในยังมี Object ที่สืบทอดมาจาก Component
  • ConcreateDecorator เพิ่มการทำงานไปยัง Component  ที่สืบทอดมาจาก Decorator อีกทีหนึ่ง
 โค้ดตัวอย่าง ภาษา Ruby
class Chicken  # คลาส Chicken
  def initialize # constructer
    @cost = 10
  end
  def cost
    @cost
  end
end
class GarlicChicken << Chicken # สืบทอดมาจาก คลาส Chicken
  def initialize(chicken) # constructer
    @cost = chicken.cost
  end

  def cost
    super + 20
  end
end
module WithCheese
  def cost
    super + 10
  end
end
module WithCoke
  def cost
    super + 15
  end
end
 chicken = Chicken.new
 puts "Normal: #{chicken.cost}"

 chicken.extend(WithCheese) # Decorate with module
 puts "WithCheese: #{chicken.cost}"

 chicken.extend(WithCoke) # Decorate with module
 puts "WithCoke: #{chicken.cost}"

 # Decorate with inheritance
 garlic_chicken = GarlicChicken.new(chicken)
 puts "GarlicChicken: #{garlic_chicken.cost}"