SoftwareDevelopmentMagazine 에 소개된 ModelViewPresenter 관련 구현 예.
http://www.sdmagazine.com/documents/s=7147/sdm0206b/0206b.htm
http://www.sdmagazine.com/documents/s=7147/sdm0206b/0206b.htm
소스코드를 보면 다음의 클래스들 관계가 MVP 이다.
Game - Model. 관계는 Presenter 와만 맺는다. 외부에서 이벤트가 발생했을때는 Presenter 를 통해 통지받는다.
Game - Model. 관계는 Presenter 와만 맺는다. 외부에서 이벤트가 발생했을때는 Presenter 를 통해 통지받는다.
관계를 맺는 코드는 Dots.java 에 있다. 즉, initialize() 를 보면 다음의 코드가 나온다.
~cpp _game = new Game(4, Arrays.asList(new String[] {"JL", "TL", "KML"})); BoardPanel boardPanel = new BoardPanel(); boardPanel.setGame(_game);실제로 BoardPanel.setGame 을 보면
~cpp public void setGame(Game game) { _presenter = new BoardPresenter(game, this); _pixelSize = getIdealSize(); setSize(_pixelSize); }이며 BoardPresenter 를 보면
~cpp public BoardPresenter(Game game, BoardPresenterDrawListener listener) { _game = game; _game.addListener(this); _listener = listener; }이다. (BoardPresenter 에서 listener 는 BoardPanel)
그리고 BoardPanel 에서 이벤트 발생시에는
BoardPanel.mouseReleased -> BoardPresenter.processClick -> Game.join 식으로 호출되며
Game 객체의 데이터가 바뀌는 경우에는 (ex : boxClosed)
Game.boxClosed -> listener.boxClosed (여기서 listener 는 Presenter. Presenter 들은 여러개가 될 수 있다. Game 객체에 addListener 로 등록된 만큼) -> BoardPanel.drawInitials. 식으로 도메인 모델로부터 올라온다.
BoardPanel.mouseReleased -> BoardPresenter.processClick -> Game.join 식으로 호출되며
Game 객체의 데이터가 바뀌는 경우에는 (ex : boxClosed)
Game.boxClosed -> listener.boxClosed (여기서 listener 는 Presenter. Presenter 들은 여러개가 될 수 있다. Game 객체에 addListener 로 등록된 만큼) -> BoardPanel.drawInitials. 식으로 도메인 모델로부터 올라온다.