2012-11-20 17 views
5

Uważa się, że mamy obiekt samochodowy. Przyspieszenie i łamanie funkcje są realizowane z wykorzystaniem wzorca strategii. Ale co jeśli chcemy wprowadzić funkcję nitro gazu do istniejącego obiektu samochodowego? Jakiego wzoru wzoru mogę użyć?Wzorzec do dynamicznego dodawania atrybutów do obiektów

Chcę dodać funkcję nitro (atrybut) po utworzeniu obiektu samochodu.

Odpowiedz

-1

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.

10

można sprawdzić Decorator pattern, może on być stosowany do dynamicznie dodać funkcjonalność do istniejącego obiektu.

+1

Uwielbiam wzór dekoratora. – Neowizard

+0

Ale możemy dodawać nowe stany lub zachowania w czasie wykonywania za pomocą wzoru dekoratora. –

+1

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

2

Dekorator może dynamicznie dodawać różne funkcje do obiektów. Ale te funkcjonalności muszą zostać wdrożone w Betonowym Dekoratorze. Programista może zdecydować, jakie funkcje dodać w czasie wykonywania.

0

Jeśli chcesz dodać nowe metody, trzeba utworzyć nową podklasę i/lub użyć delegację. Będzie to konieczne, jeśli funkcja "nitro" wymaga jawnego wywołania metody w celu aktywacji.

Jeśli jednak wszystko, co chcesz zrobić, to dodać do istniejącej funkcjonalności bez dodawania metody, Dekorator jest dobry zakład. Powiedzmy, że interfejs "Samochód" ma metodę zwaną floorIt(). W takim przypadku możesz dodać "nitro-kick" do floorIt z dekoratorem bez konieczności dodawania do inteface'a samochodu.

Oczywiście istnieje pośrednie podłoże. Jeśli korzystasz z odnajdowania typu wykonawczego i/lub wielu interfejsów, możesz zarówno użyć programu Decorator, jak i dodać metody do obiektu wynikowego.

Powiązane problemy