Android 구조의 MVP, MVVM 에 대해 간단히 이야기 하 다.
개술
MVP(Model-View-Presenter)
는 전통 MVC(Model-View-Controller)
이 안 드 로 이 드 개발 에서 의 변 종 · 진화 모델 이다.주로 UI, UI 논리 와 업무 논리, 데 이 터 를 격 리 하고 느슨 한 결합 을 만들어 다시 사용 할 수 있 는 대상 을 만 듭 니 다.우 리 는 View 층 이 쉽게 변화 하고 다양 하 며 업무 논리 도 다양 하 다 는 것 을 알 고 있다. 전통 적 인 MVC 에 비해 P 는 C 의 역할 을 한다. Model 은 데 이 터 를 저장 하고 View 는 Model 의 표현 을 나타 내 며 Presenter 는 이들 의 통신 을 조율 한다.
그 후에 MVP 를 바탕 으로 일부 변종 이 나 타 났 다. 예 를 들 어 MVVM, MVP 등 은 MVP 에 비해 MVVM 은 데이터 연결 을 더욱 간단하게 만 들 었 다. MVP VM 은 MVVM 에 Presenter 층 도입 을 추가 했다.
MVC, MVP, MVVM, MVP 도해
원본 블 로그 와 사진 제공 자 에 게 감 사 드 립 니 다.
MVC:
MVC 에서 View 는 이 벤트 를 받 아들 이 고 Controller 를 호출 하여 Model 을 조작 하 는 동시에 Model 인 스 턴 스 의 데이터 가 변 하면 Controller 는 인터페이스 (물론 View 도 Model 을 직접 업데이트 할 수 있 습 니 다) 를 업데이트 합 니 다.
전통 적 인 개발 에서 Activity 는 Controller 역할 도 하고 View 역할 도 하 는 것 과 같다. 사용자 의 응답 조작 모델 도 받 아들 여야 하고 인터페이스 도 업데이트 해 야 한다. 이렇게 하면 데이터 의 업데이트 가 간단 해 졌 지만 단점 도 뚜렷 하 다. Activity 는 비대 하고 후기 에 유지 하기 어렵다.
MVP:
MVP 는 업무 논 리 를 단독으로 Presenter 를 추출 하고 View 층 을 수 동적 인 것 으로 만 듭 니 다. Presenter 는 View 층 과 Model 층 의 상호작용 을 완성 합 니 다. View 는 Model 과 직접 상호작용 할 수 없습니다 (MVC 에서 Model 과 View 의 상호작용 을 허용 합 니 다). Presenter 가 업 데 이 트 를 알려 야 업 데 이 트 를 할 수 있 습 니 다. 또한 Presenter 와 View 의 상호작용 은 인 터 페 이 스 를 통 해 이 루어 집 니 다.
MVVM:
MVVM 은 Android 에서 data binding 에 대응 합 니 다. MVVM 은 WPF 에서 가장 먼저 사용 되 었 습 니 다. ViewModel 과 View 의 매 핑 을 통 해 View 와 Model 의 양 방향 연결 을 완 성 했 습 니 다. View 의 이 벤트 는 ViewModel 에 직접 전달 되 었 고 ViewModel 은 Model 을 조작 하고 업 데 이 트 를 받 았 습 니 다. 더 나 아가 View 에 피드백 되 었 습 니 다. ViewModel 과 View 의 결합 으로 인해 MVVM 은 View 의 재 활용 문제 가 있 습 니 다. Presenter 를 없 앴 기 때 문 입 니 다.View 층 은 여전히 과중 합 니 다.
MVPVM:
MVP VM 은 MVP 와 MVVM 의 진화 버 전 으로 ViewModel 과 View 의 결합 을 낮 추 었 습 니 다. View 는 ViewModel 의 관찰자 인터페이스 만 업데이트 해 야 합 니 다. ViewModel 은 Model 을 직접 조작 하지 않 고 Presenter. Presenter 작업 모델 에 맡 기 고 ViewModel 에 모델, View, ViewModel 간 에 Presenter 를 통 해 연결 되 었 습 니 다.
MVP 실천
Google 공식 android - architecture 는 MVP 학습 에 가장 좋 은 자료 임 에 틀림없다. 공식 프로젝트 는 서로 다른 방식 으로 MVP 를 실현 하 는 것 을 보 여 주 었 다. 그 중에서 Basic, loaders, data binding, clean, dagger, content provider, rxjava 등 서로 다른 방식 으로 똑 같은 기능 을 실현 하 는 것 을 보 여 주 었 다. 물론 우 리 는 그 정 수 를 파악 하기 만 하면 유추 할 수 있다.
공식 MVP 소감 보기
IContract
인터페이스 관리 IView
와 Presenter
인 터 페 이 스 를 한눈 에 알 수 있 고 유지 보수 도 편리 하 다.public interface AddEditTaskContract {
interface View extends BaseView<Presenter> {
//...
}
interface Presenter extends BasePresenter {
//...
}
}
View
일 때 Activity 는 IView
과 Presenter
인 스 턴 스 를 만 들 고 이들 을 연결 시 키 는 것 을 책임 집 니 다. 공식 적 인 이 그림 은 설명 할 수 있 습 니 다 //todo-mvp$TasksActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tasks_act);
// ...
TasksFragment tasksFragment =
(TasksFragment) getSupportFragmentManager().findFragmentById(R.id.contentFrame);
//...
mTasksPresenter = new TasksPresenter(
Injection.provideTasksRepository(getApplicationContext()), tasksFragment);
//...
}
IPresenter
는 구체 적 인 Presenter
에 의 해 이 루어 지고 IView
는 View 층 Activity/Fragment
에 의 해 이 루어 진다. IView
실현 유형 에는 Presenter
이 포함 되 어 있 는데 그들 은 다음 과 같은 방식 으로 연결 을 실현 한다.public interface BaseView<T> {
// View Presenter 。
void setPresenter(T presenter);
}
Presenter
구조 시 전송 IView
대상 (업데이트 View
이 필요 합 니 다. public class TasksPresenter implements TasksContract.Presenter {
private final TasksRepository mTasksRepository;
private final TasksContract.View mTasksView;
//...
public TasksPresenter(@NonNull TasksRepository tasksRepository, @NonNull TasksContract.View tasksView) {
mTasksRepository = checkNotNull(tasksRepository, "tasksRepository cannot be null");
mTasksView = checkNotNull(tasksView, "tasksView cannot be null!");
//setPresenter
mTasksView.setPresenter(this);
}
Model
JavaBean
뿐만 아니 라 조작 데이터 의 업무 논리 (획득, 저장, 업데이트) 도 가지 고 있 으 며 Model
업 무 를 인터페이스 로 추출 하여 데이터 소스 MVP 변종
MVP 구조의 장점 은 더 이상 말 하지 않 지만
Activity/Fragment
을 View
층 으로 사용 하 는 데 다음 과 같은 문제 가 있 습 니 다. 안 드 로 이 드 에서 MVP 모델 을 실현 하 는 새로운 방향 을 참고 하 십시오.Activity/Fragment
중의 시스템 서 비 스 는 업무 논리 와 밀접 한 관 계 를 가진다. 이상 적 인 상 태 는 View 가 논리 적 조작 과 관련 되 지 않 는 다 는 것 이다.Activity/Fragment
Presenter 로 서 UI 논 리 를 하나의 단독 클래스 에 추출 하여 관리 해 야 합 니 다.UI 논리 인터페이스
public interface Vu {
void inflate(LayoutInflater inflater, ViewGroup container, Bundle bundle);
View getView();
}
Presenter 의 BaseActivity 로 서 모든 라 이 프 사이클 방법 을 덮어 씁 니 다.
public abstract class BasePresenterActivity<V extends Vu> extends Activity {
protected V vu;
@Override
protected final void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
vu = getVuClass().newInstance();
vu.inflate(getLayoutInflater(), null,null);
setContentView(vu.getView());
onBindVu();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
protected final void onDestroy() {
onDestroyVu();
vu = null;
super.onDestroy();
}
protected abstract Class<V> getVuClass();
protected void onBindVu(){};
protected void onDestroyVu() {};
}
예 를 들 어:
구체 적 인 UI 논 리 는 Presenter 가 Activity 로 바 뀌 든 Fragment 로 바 뀌 든 바 꾸 지 않 아 도 됩 니 다. 주기 적 인 방법 에서 View 대외 적 인 조작 을 바 꾸 면 됩 니 다.
public class HelloVu implements Vu {
View view;
TextView helloView;
@Override
public void init(LayoutInflater inflater, ViewGroup container) {
view = inflater.inflate(R.layout.hello, container, false);
helloView = (TextView) view.findViewById(R.id.hello);
}
@Override
public View getView() {
return view;
}
public void setHelloMessage(String msg){
helloView.setText(msg);
}
}
구체 적 인 발표 자
public class HelloActivity extends BasePresenterActivity {
@Override
protected void onBindVu() {
vu.setHelloMessage("Hello World!");
}
@Override
protected Class<MainVu> getVuClass() {
return HelloVu.class;
}
}
MVVM: 데이터 의 동적 바 인 딩
공식 문서:https://developer.android.com/topic/libraries/data-binding/index.html Data Binding 을 사용 하면 xml 은 이전 과 다 릅 니 다. 공식 문 서 를 베 끼 십시오.
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout>
....
</LinearLayout>
</layout>
그 에 상응하는 Activity 의 set ContentView 도 달라 집 니 다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
}
이 자바 빈 은 xml 레이아웃 파일 에 대응 하여 View 의 재 활용 이 어렵 습 니 다.
TheMVP: MVVM 과 MVP 의 결합
TheMVP 는 이 문 제 를 해결 하고 Presenter 에서 ViewModel 인 터 페 이 스 를 정의 함으로써 데이터 의 양 방향 연결 과 MVP 의 결합 을 실현 합 니 다. 프로젝트 주소: kymjs / TheMVP
핵심 코드: 이곳 의 IDelegate 는 위의 Vu 와 비슷 합 니 다.
//ViewModel
public interface DataBinder<T extends IDelegate, D extends IModel> {
/**
* View , , View , ui
* , 。
*
* @param viewDelegate
* @param data
*/
void viewBindModel(T viewDelegate, D data);
}
Presenter: 데이터 가 바 뀔 때 notifyModelChanged () 를 호출 하여 View 를 업데이트 합 니 다.
public abstract class DataBindActivity<T extends IDelegate> extends
ActivityPresenter<T> {
protected DataBinder binder;
public abstract DataBinder getDataBinder();
public <D extends IModel> void notifyModelChanged(D data) {
binder.viewBindModel(viewDelegate, data);
}
}
MVP VM: View 재 활용 및 다이어트
MVP VM 작성 자 소개 에서...
참고: android 에서 MVP 모드 를 실현 하 는 새로운 사고방식 ANDROID MVP 모드 의 간단 하고 알 기 쉬 운 소개 방식 MVVMAndroid - Clean Architecture 제로 부터 시 작 된 Android 새 프로젝트 3 - MVP in Action, MVP 와 MVVM 이 서로 배척 하 는 MVP 구조 로 안 드 로 이 드 애플 리 케 이 션 개발
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.