2012-11-04 10 views
9

To pytanie dotyczy MVC (Model-View-Controller). Mój model aktualizuje obecnie moim zdaniem, kiedy to został zmieniony za pomocą obserwatora/obserwowalnych wzór w Javie:Czy to źle, że modele używają Observer i Observable w Javie?

public class Model extends Observable { 
} 

public class View implements Observer { 

    @Override 
    public void update(observable o, Object obj) { 
     // ... update the view using the model. 
    } 

} 

To działa prawidłowo. Jednak mój model jest coraz bardziej skomplikowane - to zaczyna trzymać wykazów innych klas:

public class Model extends Observable { 
    List<Person> people = new ArrayList<Person>(); 
} 

public class Person { 
    private String name = ""; 
    // ... getter/setter for name 
} 

Mój problem jest: kiedy zmienia nazwisko osoby Chcę zaktualizować widok słuchania modelu, który zawiera tę osobę. Jedyny sposób, jaki mogę wymyślić, to sprawić, że Model zaimplementuje klasę Observer, a Person rozszerzy klasę Observable. Następnie, kiedy Osoba się zmienia, powiadamia swoich obserwatorów (które obejmowałyby Model macierzysty).

Jednak wydaje się, że dużo pracy, jeśli moje modele stają się skomplikowane. Czy istnieją lepsze sposoby na "zapylenie" zmian w modelu macierzystym?

+1

Właściwie to zły projekt, aby używać MVC. –

+0

Czy możesz to uzasadnić lub zaproponować alternatywę? – sdasdadas

+0

Zasadniczo MVC nie "pasuje" do standardowych "nowoczesnych" koncepcji interfejsu użytkownika. Musisz stanąć na głowie, aby "oddzielić" projekt na te trzy sztuczne kategorie. Chcesz zachować separację danych/prezentacji w jak największym stopniu, ale kiedy próbujesz oddzielić "widok" i "kontroler", musisz zacząć robić bezsensowne rozróżnienia. –

Odpowiedz

4

Przede wszystkim zwykle jest zły pomysł, aby użyć Observable, ponieważ trzeba rozszerzyć tę klasę, aby z niego korzystać.
W każdym razie to, co opisujesz, jest agregacją obserwowanych bytów.
Nie komplikuj prostych rzeczy. Spraw, aby każda jednostka była obserwowalna i pozwól jej zadbać o rejestrację i powiadomienia. Nie musisz mieć, aby zawrzeć konkretnie klasę o nazwie Model, aby zagregować wszystko. Złam swój projekt.

+0

Rozumiem sugestię, by nie używać obserwowalnego. (Znalazłem również: http://stackoverflow.com/questions/1658702/how-do-i-make-a-class-extend-observable-when-it-has-extended-inne-class-too). Ale wydaje mi się, że * potrzebuję * do utrzymywania listy osób - musi istnieć jakiś obiekt, który zawiera tę listę i byłoby niewłaściwe trzymanie jej w widoku lub kontrolerze. – sdasdadas

+2

Jeśli musisz być powiadomiony, gdy właściwość "Person" jest zaktualizowana, powinieneś zajrzeć do 'PropertyChangeListener', która jest normą w projekcie MVC, np. 'Swing' http://docs.oracle.com/javase/tutorial/uiswing/events/propertychangelistener.html – Cratylus

+0

Dziękuję, nie byłem świadomy PropertyChangeListener. – sdasdadas

1

Możesz zawsze pozwolić swojej podklasie delegate na zawarte wystąpienie Observable. Niektóre inne sposoby implementacji wzorca observer są wymienione here.

+1

Dzięki - zmienię za pomocą Observable. – sdasdadas

Powiązane problemy