Witamy na śliskim stoku. W tym momencie zdałeś sobie sprawę, że istnieje nieskończona różnorodność wszystkich interakcji między widokiem modelu. MVC, MVP (Taligent, Dolphin, Passive View), MVVM, żeby wymienić tylko kilka.
Wzorzec Prezentera widoku modelu, podobnie jak większość wzorów architektonicznych, jest otwarty na wiele różnorodności i eksperymentów. Jedną wspólną cechą wszystkich wariantów jest rola prezentera jako „pośrednika” między widokiem a modelem. Dwa najczęstsze to widok pasywny i nadzorujący prezenter / kontroler - [ Fowler ]. Widok pasywny traktuje interfejs użytkownika jako bardzo płytki interfejs między użytkownikiem a prezenterem. Zawiera bardzo mało, jeśli w ogóle, logiki, która przenosi tyle odpowiedzialności na prezentera. Nadzór nad prezenterem / kontrolerempróbuje wykorzystać powiązanie danych wbudowane w wiele platform interfejsu użytkownika. Interfejs użytkownika obsługuje synchronizację danych, ale prezenter / kontroler wkracza, aby uzyskać bardziej złożoną logikę. W obu przypadkach model, widok i prezenter tworzą triadę
Istnieje wiele sposobów, aby to zrobić. Bardzo często postrzegane jest to przez traktowanie każdego okna dialogowego / formularza jako innego widoku. Wiele razy istnieje stosunek 1: 1 między widokami a prezenterami. To nie jest trudna, szybka zasada. Dość często zdarza się, że jeden prezenter obsługuje wiele powiązanych widoków i odwrotnie. Wszystko zależy od złożoności widoku i złożoności logiki biznesowej.
Jeśli chodzi o sposób, w jaki widoki i prezenterzy uzyskują odniesienia do siebie, jest to czasami nazywane okablowaniem . Masz trzy możliwości:
Widok zawiera odniesienie do prezentera
Formularz lub okno dialogowe implementuje widok. Formularz ma procedury obsługi zdarzeń, które są przekazywane do prezentera za pomocą bezpośrednich wywołań funkcji:
MyForm.SomeEvent(Sender)
{
Presenter.DoSomething(Sender.Data);
}
Ponieważ prezenter nie ma odniesienia do widoku, widok musi przesłać mu dane jako argumenty. Prezenter może komunikować się z widokiem za pomocą funkcji zdarzeń / wywołań zwrotnych, których widok musi nasłuchiwać.
Prezenter posiada odniesienie do widoku
W scenariuszu widok przedstawia właściwości danych, które wyświetla użytkownikowi. Prezenter nasłuchuje zdarzeń i manipuluje właściwościami w widoku:
Presenter.SomeEvent(Sender)
{
DomainObject.DoSomething(View.SomeProperty);
View.SomeOtherProperty = DomainObject.SomeData;
}
Oba zawierają odniesienia do siebie, tworząc zależność cykliczną. Z
tym scenariuszem łatwiej jest pracować niż z innymi. Widok reaguje na zdarzenia, wywołując metody w prezencie. Prezenter odczytuje / modyfikuje dane z widoku poprzez odsłonięte właściwości.
View.SomeEvent(Sender)
{
Presenter.DoSomething();
}
Presenter.DoSomething()
{
View.SomeProperty = DomainObject.Calc(View.SomeProperty);
}
Istnieją inne kwestie, które należy wziąć pod uwagę przy wzorcach MVP. Kolejność tworzenia, czas życia obiektu, w którym odbywa się okablowanie, komunikacja między triadami MVP, ale ta odpowiedź urosła już wystarczająco długo.