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

- Component กำหนดการทำงานสำหรับวัตถุที่สามารถเพิ่มให้หน้าที่การทำงานได้แบบไดนามิก
- ConcreteComponent สามารถเพิ่มการทำงานสำหรับวัตถุ ที่สืบทอดมาจาก Component
- Decorator เป็น Class ที่สืบทอดมาจาก Component และภายในยังมี Object ที่สืบทอดมาจาก Component
- ConcreateDecorator เพิ่มการทำงานไปยัง Component ที่สืบทอดมาจาก Decorator อีกทีหนึ่ง
โค้ดตัวอย่าง ภาษา Ruby
[code]
class Chicken # คลาส Chicken
def initialize # constructer
@cost = 10
end
def cost
@cost
end
end
[/code]
[code]
class GarlicChicken << Chicken # สืบทอดมาจาก คลาส Chicken
def initialize(chicken) # constructer
@cost = chicken.cost
end
def cost
super + 20
end
end
[/code]
[code]
module WithCheese
def cost
super + 10
end
end
[/code]
[code]
module WithCoke
def cost
super + 15
end
end
[/code]
[code]
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}"
[/code]
