1227 TIL
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 가능한 구조로 만들자
- 프리젠터 먼저 구현하기