W językach wpisanych statycznie nie można dodawać metod do obiektu w środowisku wykonawczym. Kompilator, gdy napotka instrukcję taką jak: car.nitroAccelerate(), sprawdza, czy obiekt samochodu implementuje dowolny interfejs, który ma metodę nitroAccelerate. Gdybyś mógł dodać (lub usunąć) metody w czasie wykonywania, takie kontrole byłyby niemożliwe.
Języki dynamiczne pozwalają na dodawanie metod w czasie wykonywania. Ale ma to tę wadę, że gdy w kodzie umieszczasz car.nitroAccelerate(), musisz dokładnie przeanalizować, czy obiekt samochodu w tym punkcie ma taką metodę.
dekorator można użyć do modyfikowania istniejących metod w czasie wykonywania, ale robi tak, że nie są modyfikując istniejący obiekt, tylko utworzenie nowego która otacza stary.
Więc jeśli coś takiego:
Car fasterCar = new CarWithNitro(car);
a niektóre kawałek kodu nadal posiada odniesienie do oryginalnego samochodu, ten oryginalny samochód nie byłoby szybciej, ponieważ akt owijania nie zmienia oryginalny.
Uwielbiam wzór dekoratora. – Neowizard
Ale możemy dodawać nowe stany lub zachowania w czasie wykonywania za pomocą wzoru dekoratora. –
Wzór dekoratora polega na dodaniu funkcjonalności poprzez zawijanie obiektu i udostępnianie rozszerzonego interfejsu. Ta nowa implementacja funkcjonalności może wykorzystywać dodatkowe narzędzia i techniki, takie jak dodatkowe wzorce projektowe. Pamiętaj, że wzorzec projektowy nie zastępuje własnego kodu, jest to narzędzie, które powinno być używane w razie potrzeby. – SomeWittyUsername