MVC w grze Saper, odświeżanie widoku

0

Witam, piszę grę Saper z wykorzystaniem wzorca MVC, lecz nie do końca rozumiem jak ma wyglądać komunikacja między poszczególnymi warstwami programu. Czytałem trochę na ten temat, ale mam co do tego wąpliwość.
Ogólna zasada działania programu wygląda tak, że w modelu trzymam sobie w tablicy dwuwymiarowej wszelkie dane dotyczące pojedynczego pola planszy i kilka innych mniej znaczących danych. Widok działa w ten sposób że wszystkie pola planszy wyświetlane są w JPanel, dodaję do niego MouseListenera, dzięki czemu rozpoznaję który przycisk został wciśnięty i współrzędne miejsca gdzie został wciśnięty, po czym dodaję do obiektu BlockingQueue element(dokładniej to event). Ta kolejka służy do komunikacji między widokiem a kontrolerem. Kontroler działa w ten sposób, że zabiera z tej kolejki BlockingQueue element, i na podstawie tego, jaki to był dokładnie element wykonuje odpowiednie metody z modelu. Wstawię teraz trochę kodu z kontrolera, bo moje wątpliwości skupiają się wokół tego.

public class Controller{
	private View view;
	private Model model;
	private BlockingQueue<ApplicationEvent> blockingQueue;
	private final Map<Class<? extends ApplicationEvent>, ApplicationAction> applicationEventMap;
	
	/**
	 * Konstruktor kontrolera tworzy obiekt typu Controller
	 * @param view referencja na obiekt typu View
	 * @param model referencja na obiekt typu Model
	 * @param blockingQueue kolejka służąca do otrzymywania komunikatów z widoku
	 */
	public Controller(View view, Model model, BlockingQueue<ApplicationEvent> blockingQueue){
		this.view=view;
		this.model=model;
		this.blockingQueue = blockingQueue;

		
		applicationEventMap = new HashMap<Class<? extends ApplicationEvent>, ApplicationAction>();
		fillApplicationEventMap();
	}

	private void fillApplicationEventMap(){
		applicationEventMap.put(LeftButtonClickedEvent.class, new ApplicationAction(){
			public void go(ApplicationEvent event){
				LeftButtonClickedEvent leftButtonClickedEvent = (LeftButtonClickedEvent) event;
				if(model.discoverField(leftButtonClickedEvent.getX(), leftButtonClickedEvent.getY()))
					view.update(model.getBoardForCommunication());
                /*
                * Coś tam jeszcze
                */
			}
		});
		
		applicationEventMap.put(RightButtonClickedEvent.class, new ApplicationAction(){
			public void go(ApplicationEvent event){
				RightButtonClickedEvent rightButtonClickedEvent = (RightButtonClickedEvent) event;
				if(model.getBoard().markField(rightButtonClickedEvent.getX(), rightButtonClickedEvent.getY()))
					view.update(model.getBoardForCommunication());
                /*
                * Coś tam jeszcze
                */
			}
		});

         /*
         * Coś tam jeszcze
         */
	}

	public void work(){
		while(true){
			try{
				ApplicationEvent event = blockingQueue.take();
				ApplicationAction applicationAction = applicationEventMap.get(event.getClass());
				applicationAction.go(event);
			} catch(Exception ex){
				ex.printStackTrace();
				throw new RuntimeException(ex);
			}
		}
	}
	
	
}
}

Widok aktualizuje w ten sposób, że w kontrolerze wywołuję metodę update na rzecz obiektu view z parametrem, który jest tablicą dwuwymiarową liczb całkowitych wygenerowaną poprzez wynik działania metody getBoardForComunication na rzecz obiektu model.

 view.update(model.getBoardForCommunication());

Głównie chciałbym się zapytać, czy powinienem aktualizować widok w kontrolerze czy jednak w modelu?

0

Widok powinien być zapięty na zmiany modelu i sam się odświeżać

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