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.

python
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])
text
16
[('espresso', ()), ('espresso', ('milk',)), ('espresso', ('sugar',))]

Struktur

`Espresso`, `Milk` və `Sugar` `Beverage`-i həyata keçirir; dekoratorlar daxili `Beverage` saxlayır
Espresso, Milk və Sugar Beverage-i həyata keçirir; dekoratorlar daxili Beverage saxlayır

Dekorator 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.

python
class Espresso:
    def description(self):
        return "espresso"

    def cost(self):
        return 200