Muszę napisać program w Javie w oparciu o architekturę trójwarstwową. Mam warstwę logiki gdzie mam jakieś tam obiekty i metody.
Tworzę interfejs z jakimiś tam przyciskami i na koniec tworzę kontroler - klasę implementującą ActionListener który obsługuje te przyciski. Mam tylko mały problem bo jak obiekty logiki tworze gdzie indziej to nie mogę się przez ich nazwę odwołać do metod gdy chce je wywołać w obiekcie kontrolera. Jak to rozwiązać? A może zupełnie nie poprawnie do tego podchodzę i wykonać to inaczej?
Jak zbudować kontroler dla architektury trójwarstwowej.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 33
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Problem który napotkałeś nazywa się Wstrzykiwaniem Zależności (Dependency Injection). Sposobów na jego rozwiązanie jest sporo. Najprostszy polega po prostu na dostarczeniu serwisów odpowiadających za logikę do kontrolera za pomocą kontruktora / setterów.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 33
Mógł byś szerzej wyjaśnić jak korzystając z settera lub konstruktora rozwiązać ten problem?
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Space: the final frontier
- Postów: 26433
Ech. Przykładowo mamy KontrolerKontaBankowego i SerwisObsługiKonta.
Kontroler w trakcie tworzenia dostaje referencje do SerwisObsługiKonta za pomocą argumentu konstruktora albo za pomocą settera. Jeśli użytkownik wykonuje jakąś akcje to kontroler ją obsługuje a następnie wykonuje odpowiednie operacje na SerwisObsługiKonta (który jest obiektem związanym z modelem). Nie bardzo rozumiem w czym widzisz problem.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 15
Jak dobrze rozumiem masz taką sytuację. Masz clase A która korzysta z jakich metod z klasy B. To co czego potrzebujesz to refrencja to klasy B.
class A{
public B refB;
void setB(B obj){
this.refB = obj;
}//Teraz mozesz za pomoca refB korzystac z objektu B tylko musisz go sobie w kodzie setterm podlaczyc
}
class B{
void bFun(){
System.out.println("Jakas fun");
}
}
potem w main coś takiego:
A a = new A();
B b = new B();
a.setB(b);
a.refB.bFun()
Jak masz refencje jako private to musisz wywołanie metody B jakość opakować sobie.
Spring załatwia problem wstrzykiwania poprzez adnotację
@Autowierd
B refB
Wtedy contener springa sam znajduje klase jaką tam ma wstrzyknąć. Ale też robi to defacto za pomocą setterów lub konstruktorów ale jest mniej pisania lub można sobie wszystko skonfigurować w jednym pliku XML.
- Rejestracja: dni
- Ostatnio: dni
Mam jescze jeden problem, bo buttony mam w oknie głównym a kontroler w osobnej klasie, jak skomunikować taki przycisk z actionListenerem?