Middle
Модель-Қарау-Өкіл (Model-View-Presenter) паттерні туралы толық айтып бере аласыз ба?
sobes.tech AI
AI-дан жауап
Қосымшаны үш негізгі компонентке бөледі:
- Model: Мәліметтер мен бизнес-логиканы көрсетеді. View немесе Presenter туралы ештеңе білмейді.
- View: Мәліметтерді көрсету және пайдаланушымен өзара әрекеттесу үшін жауап береді. Пассивті, шешім қабылдау логикасын қамтымайды. Барлық пайдаланушы әрекеттерін Presenter-ге жүктейді.
- Presenter: Model мен View арасында делдал ретінде әрекет етеді. Пайдаланушы әрекеттерін өңдейді, Model-ден мәліметтерді алады және View-ді жаңартады. Көрсету логикасын қамтиды.
Артықшылықтары:
- Жақсартылған тестілеу мүмкіндігі (Presenter логикасы оқшауланған түрде оңай тестіленеді).
- Жауапкершілікті бөлу.
- Көрсету логикасын қайта пайдалану (әртүрлі View-да).
Кемшіліктері:
- Класстар санының артуы.
- boilerplate-код (View және Presenter интерфейстері).
Өзара әрекеттесу:
- View пайдаланушы әрекеттері туралы Presenter-ге хабарлайды.
- Presenter Model-мен өзара әрекеттеседі (мәліметтерді алады/сақтайды, бизнес-логиканы орындайды).
- Presenter Model-ден нәтиже алады.
- Presenter View-ді жаңартады, оның әдістерін шақырады.
Мысал:
// View интерфейсі
interface MainView {
void showProgress();
void hideProgress();
void displayData(String data);
void showError(String message);
}
// Presenter интерфейсі
interface MainPresenter {
void attachView(MainView view);
void detachView();
void fetchData();
}
// View жүзеге асыру (Activity/Fragment)
public class MainActivity extends AppCompatActivity implements MainView {
private MainPresenter presenter;
// ... интерфейс әдістерінің жүзеге асырылуы
}
// Presenter жүзеге асыру
public class MainPresenterImpl implements MainPresenter {
private MainView view;
private Model model; // Model-ге сілтеме
@Override
public void attachView(MainView view) {
this.view = view;
this.model = new ModelImpl(); // Model-ді инициализациялау
}
@Override
public void detachView() {
this.view = null;
this.model = null;
}
@Override
public void fetchData() {
if (view != null) {
view.showProgress();
// Model-ден мәліметтерді сұрау
model.getData(new Model.DataCallback() {
@Override
public void onSuccess(String data) {
if (view != null) {
view.hideProgress();
view.displayData(data);
}
}
@Override
public void onError(String message) {
if (view != null) {
view.hideProgress();
view.showError(message);
}
}
});
}
}
}
// Жай Model
interface Model {
interface DataCallback {
void onSuccess(String data);
void onError(String message);
}
void getData(DataCallback callback);
}
class ModelImpl implements Model {
@Override
public void getData(DataCallback callback) {
// Мәліметтерді алу имитациясы
new Handler().postDelayed(() -> {
callback.onSuccess("Model-ден мәліметтер");
}, 1000);
}
}