Cześć wszystkim. Szukam jak najlepszego rozwiązania z punktu widzenia architektonicznego następującego problemu:
Otóż jest klasa nazwę ją Class1, która korzysta z Class3 i Class4. Ja natomiast napisałem klasę Class2, która w podobny sposób skorzysta z Class3 i Class4, użyje tych samych metod, jednak wymaga, aby w metodach klas Class3 i Class4 było inne specjalne zachowanie dla Class2, jednocześnie, nie psując zachowania dla Class1, ale ta indywidualna zmiana specjalna dla Class2 jest w środku metod Class3 i Class4, które również wywołuje Class1.
Rozwiązania, które wydają mi się kiepskim pomysłem to dodanie flagi boolean po której bym sprawdzał skąd jest wywołanie i dostosował zachowanie. Bądź napisać podobne osobne metody specjalnie dla Class2, ale to wiążę się z dużą redundancją kodu, a z tego powodu, że różnica w zachowaniu są w środku metod klas Class3 i Class4 powoduje, że nie bardzo da się je rozdzielić przez wyodrębnienie na mniejsze.
Pomysł jaki przyszedł mi do głowy to coś takiego:
JEDNA KLASA
public class Class2 {
private Class2 class2 = this;
.
.
.
Class3 export = new Class3();
byte[] data = export.metodaClass3(zmienna1, zmienna2, class2);
DRUGA KLASA
public class Class3 {
private Class2 class2 = null;
public byte[] metodaKlasy2(Long[] zmienna1, Long zmienna2, Class2 class2) throws SQLException {
this.class2 = class2;
return exportData(zmienna1, zmienna2);
}
private ByteArrayOutputStream exportData(Long[] zmienna1, Long zmienna2) throws Exception {
.
.
.
if(this.class2 != null)
Zrób jedno (jesli wywolanie bylo z class2)
else
Zrób drugie (jesli wywołanie bylo z class1)
}
Nie jestem przekonany co do tego pomysłu, m.in. dlatego, że jeśli Class2 nie będzie używana to w Class3 będzie ciągle śmieć w postaci instancji class2.. i to samo by było dla Class4 dlatego pytam o inne rozwiązanie.
Nad czym się zastanawiam to może użyć klasy abstrakcyjnej bądź interfejsu, ale tym sposobem również byłaby nie mała redundancja kodu, bo trzeba by było zaimpelmentować bardzo podobne metody w każdej podklasie wyspecjalizowanej osobno dla Class1 i Class2, oraz może być może byłby to przerost formy nad treścią, jeżeli to jest potrzebne tylko dla wywołań dwóch klas (Class1, Class2). Jeśli jednak tak będzie lepiej pod względem architektonicznym i czystego kodu to tak bym zrobił, ale nie wiem i pytam o radę. Mam nadzieje, że za bardzo nie zagmatwałem tej sprawy i Wy jako czytelnicy zrozumiecie o co mi chodzi i doradzicie dobre rozwiązanie. :)