Czesc,
Mam obiekt który muszę "wzbogacić" o dodatkowe pole (opakować go). Nie mogę ingerować w żaden sposób w kod obiektu który chcę rozbudować (ani w sposób jego tworzenia). Chciałbym żeby w przypadku gdy orginalny obiekt (ten ktory chce rozbudowac) zostanie zmieniony to żeby mój obiekt którym go opakuję miał wszystkie jego nowe metody bez zadnej interwencji z mojej strony. Macie jakiś pomysł (wzorzec projektowy), etc?
Ale przecież w temacie sam sobie odpowiedziałeś. Z opisu rozumiem że chodzi ci o wzorzec Dekorator?
Dekorator nie spełnia jednego wymagania - jeżeli do klasy opakowanej dojdzie nowa metoda, to w dekoratorze nie będzie ona automatycznie dostępna (trzeba ją dopisać).
Czy jednak tak silne wymaganie jest naprawdę konieczne?
Jeżeli tak, to możesz zastosować:
Faktycznie, nie zauważyłem tego wymagania. Jeśli musi tak być to raczej nie ma innej opcji niż Dziedziczenie albo pobieranie informacji o metodach z refleksji.
Żeby użyć dekoratora to z klasy którą chcę dekorować muszę wyodrębnić interfejs. Ja nie mogę w żaden sposób ruszać kodu tej klasy
wiec dziedzicz zamiast opakowywać
W sumie byłoby to logiczne ale chyba zapomniałem wspomnieć o ważnej rzeczy. Nie może zmienić mi się sposób wywoływania kodu. Może przykład przybliży problem:
class KlasaKtorejNieMogeZmieniac{
private a;
private b;
String metodaA(){
return a;
}
String metodaB(){
return b;
}
}
class KlasaPomocnicza extends KlasaKtorejNieMogeZmieniac{
String metodaNowa(){
return "Nowa";
}
}
class C{
Object metodaBiznesowa(){
KlasaKtorejNieMogeZmieniac obj = invoke(...);//jakis kod dostarczajacy mi obiekt klasy "KlasaKtorejNieMogeZmieniac"
//tutaj chciałbym zwrócić obiekt na którym mogę robić wywołania w identyczny sposób jakbym mniał obiekt KlasaKtorejNieMogeZmieniac (wowołuje przy pomocy refleksji)
//takie metody:
//obj.metodaA();
//obj.metodaB();
//Ale oprócz tego rownież
//obj.metodaNowa();
}
}
Dziedziczenie odpada, gdyż nie kontrolujesz tworzenia obiektu.
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html odpada, gdyż KlasaKtorejNieMogeZmieniac nie wystawia swoich metod jako interfejsy.
Tak myślałem, ze to jest nie bardzo do zrobienia
Jedyna opcja to chyba zastosowanie bibliotek javassist lub CGLib.
np. javassist (zobacz punkt "4.3 Adding a new method or field"):
http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html