Komunikacja klient - bank

0

Mam do zaprojektowania i zakodowania system bankowy (ćwiczenie na studia). Niektóre z założeń są następujące:
Dozwolone operacje bankowe: przelew, depozyt, transfer (przelew międzynarodowy).
Dodatkowo klient powinien móc poprosić o utworzenie nowego konta, zmiana konta głównego na inne, usunięcie konta itp.
Wszystkie te operacje muszą być przetwarzane i walidowane przez bank.

Problem jest sposób zaprojektowania komunikacji między klientem, a bankiem, tak żeby obiekt klasy Client nie miał dostępu do publicznych metod klasy Bank - takich jak chociażby tworzenie nowych klientów.

Pomyślałem, że stworzę klasę Mediator, która będzie odbierać prośby od klienta i przekazywać je do banku, uniemożliwiając klasie Client bezpośredni kontakt z klasą Bank i jej metodami. Wszystkie 3 klasy miałyby implementować ten sam interfejs IBank, który zawierałby metody opisane wyżej (przelew, depozyt itd.). Client miałby referencję do obiektu klasy Mediator a mediator referencję do obiektu Bank i tak by to działało.
Problem w tym że teraz klasa Mediator ma dostęp do publicznych metod banku :/. Nie wiem jak sobie z tym poradzić ? Może jest jakiś wzorzec projektowy do tego?

1

Mediator to dobre podejście, choć w opisanym przez ciebie przypadku będzie tak naprawdę tylko sztuczną warstwą.
By ten mediator miał sens musi obsługiwać logikę związaną z weryfikowaniem uprawnień do wykonania konkretnych operacji. W przeciwnym wypadku będzie to wyglądać tak:

///... w kliencie
mediator.przelew(danePrzelewu);
///... w mediatorze 
public Wynik przelew(DanePrzelewu danePrzelewu){
   return bank.przelew(danePrzelewu);
}

jak widać takie coś to rachityczny obiekt, który jest tak naprawdę zbędną warstwą i nie separuje w rzeczywistości klienta od banku. Jeżeli jednak zrobisz to w taki mniej więcej sposób (kod pisany ad hoc i jest paskudny):

public Wynik przelew(final DanePrzelewu danePrzelewu){
    Wynik wynik =  securityManager.verify(danePrzelewu, new VerificationCallback(){
                              public Wynik whenCan(DanePrzelewu dane){
                                     return bank.przelew(dane);
                              }
                        });
    return wynik;
}

to taka separacja zaczyna mieć sens. Obiekt separujący, czyli mediator, ma jakieś konkretne zadanie, a nie tylko zajmuje się pośrednictwem w wywołaniu metody bez jakiegokolwiek rozsądnego zadania.

0

@Koziołek dzięki za odpowiedź i podpowiedź :) Właśnie też chciałem tak zrobić żeby mediator przy okazji walidował dane i przekazywał bankowi tylko to co faktycznie nadaje się do wykonania. Jednak w zadaniu mam napisane: "... każda transakcja może znajdować się w trzech stanach: PRZYJĘTY, POTWIERDZONY oraz ANULOWANY. Status potwierdzony uzyskiwany jest poprzez potwierdzeni z Banku". Czyli wynika z tego że to klasa Banku powinna weryfikować dane.
No nic, zrobię na razie z tym mediatorem i zobaczę co mi prowadzący powie na ten temat.

1

Bank, przeprowadza walidację biznesową - sprawdza środki na koncie, poprawność numerów kont, itp. Mediator sprawdza poprawność wywołania operacji - czy klient ma prawo ją wywołać, czy wywołanie jest opatrzone odpowiednim podpisem (PIN/Kod SMS), czy nie ma błędu w strukturze informacji (wstępna walidacja informacji np. ujemne kwoty).

1 użytkowników online, w tym zalogowanych: 0, gości: 1