Các mẫu thiết kế Python - Trình trang trí
Mẫu trang trí cho phép người dùng thêm chức năng mới vào một đối tượng hiện có mà không làm thay đổi cấu trúc của nó. Loại mẫu thiết kế này nằm dưới mẫu cấu trúc vì mẫu này hoạt động như một lớp bao bọc cho lớp hiện có.
Mẫu này tạo ra một lớp decorator, lớp này bao bọc lớp ban đầu và cung cấp chức năng bổ sung giữ nguyên chữ ký của các phương thức lớp.
Động cơ của mẫu trang trí là gắn các trách nhiệm bổ sung của một đối tượng một cách động.
Cách triển khai mẫu thiết kế trang trí
Đoạn mã được đề cập bên dưới là một minh chứng đơn giản về cách triển khai mẫu thiết kế decorator trong Python. Hình minh họa liên quan đến việc trình diễn một quán cà phê dưới dạng lớp học. Lớp cà phê được tạo ra là một lớp trừu tượng, có nghĩa là nó không thể được tạo ra ngay lập tức.
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'
Việc triển khai lớp trừu tượng của quán cà phê được thực hiện với một tệp riêng biệt như được đề cập bên dưới:
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()))
Đầu ra
Chương trình trên tạo ra kết quả sau: