ในการเขียนโปรเเกรมเชิงวัตถุ 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]