Decorator pattern-i obyekti eyni interfeysli başqa obyektlə sarıyaraq ona dinamik davranış əlavə edir. Sarğı çağırışı sarılan obyektə ötürür və əvvəl və ya sonra nəsə edir. Varislikdən fərqli olaraq, dekoratorları üst-üstə yığmaq və icra zamanı seçmək olar.
Niyə alt siniflər yox?
Qəhvəyə istənilən əlavə kombinasiyası vermək olar. Varislikdə hər kombinasiya bir sinifdir: iki əsas və üç əlavə artıq 16 tələb edir, hər yeni əlavə sayı iki dəfə artırır.
from itertools import combinations
bases = ["espresso", "tea"]
addons = ["milk", "sugar", "cream"]
combos = [(base, extra)
for base in bases
for r in range(len(addons) + 1)
for extra in combinations(addons, r)]
print(len(combos)) # subclasses needed with inheritance
print(combos[:3])16
[('espresso', ()), ('espresso', ('milk',)), ('espresso', ('sugar',))]Struktur
Espresso, Milk və Sugar Beverage-i həyata keçirir; dekoratorlar daxili Beverage saxlayırDekorator Beverage olur (interfeysi həyata keçirir) və Beverage malik olur (inner saxlayır). Hər metod inner-ə həvalə edir və öz hissəsini əlavə edir, ona görə istənilən sayda dekorator iç-içə qoyula bilər.
class Espresso:
def description(self):
return "espresso"
def cost(self):
return 200