1 분 소요

Created By: forbid403 Last Edited: Dec 27, 2019 11:38 PM

MVP 패턴 (Model-View-Presenter)

→ View와 Model이 독립적임

Model ← Notify - Presenter ← getter, setter 제공 - View

→ View는 일종의 VO

→ interaction은 Presenter가 담당.

  • Model
    • 비즈니스 로직과 어플리케이션 데이터 (인증, 가계 정보)
  • View
    • 이벤트를 프리젠터에 전달 (로그인 버튼을 클릭하면 프리젠터에 인증 실행 요청)
    • 사용자에게 알맞은 화면 제공 (프리젠터를 통해 전달받은 데이터를 위젯을 통해 표현, 로딩 중, 경고 대화창 등 안내)
  • Presenter
    • 사용자 요청에 반응 (뷰 - 인증요청, 모델 - 인증 수행, 뷰에 모델에서 수행한 결과를 전달)
    • 뷰의 흐름 제어 (인증 시작 전에 뷰를 통해 진행 중 대화창을 보여주고, 인증에 성공하면 뷰를 통해 메인화면으로 이동)

구현

  • 인터페이스
    • 사용자에게 보여질 기능을 정의
    • 프리젠터가 호출할 기능
    • 데이터 출력 기능, 진행 중 알림 기능
  • 뷰 구현체
    • 인터페이스에 정의한 기능의 구현 제공
    • 사용자 이벤트를 프리젠터에 전달
    • 데이터를 리스트로 표시, 사용자가 항목을 클릭하면 프리젠터에 선택 요청 전달
    public interface StoreListView{
    	void showLoadintMessage();
    }

    public class showLoadingMessage(){
    	progress = ProgressDialog.show(this, "", "로딩중");
    }

프리젠터

  • 사용자의 UI 행위를 추상화한 메서드로 기능을 정의
  • 뷰 구현에 의존하지 않는다
      public class StoreListPresent{
      	private StoreListView view;
      	private StoreListModel model;
      	public void onLocationChange(Coord location){
      		viewShowLoadingMessage();
      		try{
      			List <Store> stores = model.getStoresIn(location, 100);
      			view.hideLoadingMessage();
      			view.displayStores(stores);
      		}catch(Exeption e){
      			view.hideLoading();
      			view.showFailMessage();
      		}
      	}
      }
    

  • 프리젠터에 비동기 결과 전달 방법 필요
    • 콜백 (Callback), 옵저버 (Observer) 등
  • Activity/fragment 라이프사이클에 맞춰 기능을 구현해야 할 경우, 프리젠터에 라이프 사이클 관련 메서드 정의
  • 모델에 다양한 로직이 있다면 unit test 가능한 구조로 만들자
  • 프리젠터 먼저 구현하기

카테고리:

업데이트: