2010-06-01 13 views
6

Właśnie zacząłem grać z Observable, Observer i to jest metoda update() i nie mogę zrozumieć, co powinienem zrobić, gdy różne akcje wywołują notifyObservers().Jak wykonywać różne operacje w ramach aktualizacji Observer() w Javie?

Mam na myśli, moja klasa Observable ma kilka różnych metod, które wywołują w końcu setChanged() i notifyObservers(). W zależności od wywoływanej metody należy zaktualizować część interfejsu użytkownika (Swing). W klasie Observer zaimplementowano jednak tylko jedną metodę.

Chociaż przekazałem coś do metody notifyObservers(), a następnie mogę sprawdzić argument na update(), ale nie jest to dobry sposób na zrobienie tego. Nawet jeśli tak, to co powinienem zrobić? Ciąg z krótkim opisem działania/metody? Int, podobnie jak kod akcji/metody? Coś innego?

Jaki jest najlepszy sposób na poradzenie sobie z taką sytuacją?

Odpowiedz

7

ogólnie należy zaktualizować wszystko od obserwowalne, gdy pojawi się wywołanie aktualizacji(). jeśli to nie jest praktyczne, możesz przekazać podpowiedź do notifyObservers().

gang-of-książki mówi, że jedną z konsekwencji wzoru obserwatora.

„Niespodziewane aktualizacje Ponieważ obserwatorzy nie mają wiedzy o obecności siebie nawzajem, mogą być ślepy na ostateczny koszt zmiany podmiot Z pozoru niewinna operacja na obiekcie może powodować kaskadę aktualizacji obserwatorów i ich obiektów zależnych, ponadto kryteria zależności, które nie są dobrze zdefiniowane lub utrzymywane, zwykle prowadzą do fałszywych aktualizacji, które mogą być trudne do wyśledzenia.

Ten problem jest pogarszany przez fakt, że prosty protokół aktualizacji nie zawiera żadnych szczegółów na temat tego, co zmieniło się w temacie. o pomóż obserwatorom odkryć, co się zmieniło, mogą być zmuszeni do ciężkiej pracy, aby wydedukować zmiany. " również w trakcie realizacji, mówią:

" Unikanie protokołów aktualizacji specyficznych dla obserwatora: modele push i pull. Implementacje wzorca obserwatora często powodują, że podmiot transmituje dodatkowe informacje o zmianie. Temat przekazuje tę informację jako argument do Aktualizacji. Ilość informacji może się znacznie różnić.

Na jednym krańcu, który nazywamy modelem push, podmiot wysyła obserwatorom szczegółowe informacje o zmianie, czy tego chcą, czy nie. Na drugim biegunie jest model ciągnięcia; przedmiot wysyła tylko minimalną notyfikację, a obserwatorzy pytają o szczegóły dopiero później.

Model przyciągania podkreśla niewiedzę podmiotu o obserwatorach, podczas gdy model wypychania zakłada, że ​​badani wiedzą coś o potrzebach swoich obserwatorów. Model "push" może sprawić, że obserwatorzy będą mniej przydatni do ponownego użycia, ponieważ klasy podmiotowe przyjmują założenia dotyczące klas Obserwatora, które nie zawsze są prawdziwe. Z drugiej strony model przyciągania może być nieefektywny, ponieważ klasy obserwatorów muszą ustalić, co zmieniło się bez pomocy podmiotu. "

3

Drugi parametr do update() jest typu Object, więc możesz przekazać cokolwiek odpowiedniego. Jak zauważasz, podejście jest raczej ogólne. W przeciwieństwie do klasy, która utrzymuje EventListenerList może uzyskać stopień bezpieczeństwa typu run-time, gdy jest używany zgodnie z określeniem.

Powiązane problemy