รูปแบบการออกแบบ Python - มัณฑนากร
รูปแบบ Decorator ช่วยให้ผู้ใช้สามารถเพิ่มฟังก์ชันการทำงานใหม่ให้กับวัตถุที่มีอยู่ได้โดยไม่ต้องเปลี่ยนแปลงโครงสร้าง รูปแบบการออกแบบประเภทนี้อยู่ภายใต้รูปแบบโครงสร้างเนื่องจากรูปแบบนี้ทำหน้าที่เป็นตัวห่อหุ้มคลาสที่มีอยู่
รูปแบบนี้จะสร้างคลาสมัณฑนากรซึ่งจะปิดคลาสเดิมและมีฟังก์ชันเพิ่มเติมที่ทำให้ลายเซ็นเมธอดคลาสเหมือนเดิม
แรงจูงใจของรูปแบบมัณฑนากรคือการแนบความรับผิดชอบเพิ่มเติมของวัตถุแบบไดนามิก
วิธีใช้รูปแบบการออกแบบมัณฑนากร
โค้ดที่กล่าวถึงด้านล่างเป็นการสาธิตวิธีใช้รูปแบบการออกแบบมัณฑนากรใน Python ภาพประกอบเกี่ยวข้องกับการสาธิตร้านกาแฟในรูปแบบของชั้นเรียน คลาสกาแฟที่สร้างขึ้นเป็นนามธรรมซึ่งหมายความว่าไม่สามารถสร้างอินสแตนซ์ได้
import six
from abc import ABCMeta
@six.add_metaclass(ABCMeta)
class Abstract_Coffee(object):
def get_cost(self):
pass
def get_ingredients(self):
pass
def get_tax(self):
return 0.1*self.get_cost()
class Concrete_Coffee(Abstract_Coffee):
def get_cost(self):
return 1.00
def get_ingredients(self):
return 'coffee'
@six.add_metaclass(ABCMeta)
class Abstract_Coffee_Decorator(Abstract_Coffee):
def __init__(self,decorated_coffee):
self.decorated_coffee = decorated_coffee
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients()
class Sugar(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost()
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', sugar'
class Milk(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.25
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', milk'
class Vanilla(Abstract_Coffee_Decorator):
def __init__(self,decorated_coffee):
Abstract_Coffee_Decorator.__init__(self,decorated_coffee)
def get_cost(self):
return self.decorated_coffee.get_cost() + 0.75
def get_ingredients(self):
return self.decorated_coffee.get_ingredients() + ', vanilla'
การใช้งานระดับนามธรรมของร้านกาแฟนั้นทำด้วยไฟล์แยกต่างหากตามที่ระบุไว้ด้านล่าง -
import coffeeshop
myCoffee = coffeeshop.Concrete_Coffee()
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Milk(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Vanilla(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
myCoffee = coffeeshop.Sugar(myCoffee)
print('Ingredients: '+myCoffee.get_ingredients()+
'; Cost: '+str(myCoffee.get_cost())+'; sales tax = '+str(myCoffee.get_tax()))
เอาต์พุต
โปรแกรมข้างต้นสร้างผลลัพธ์ต่อไปนี้ -