Sobes.tech
Middle

Модель-Қарау-Өкіл (Model-View-Presenter) паттерні туралы толық айтып бере аласыз ба?

sobes.tech AI

AI-дан жауап

Қосымшаны үш негізгі компонентке бөледі:

  • Model: Мәліметтер мен бизнес-логиканы көрсетеді. View немесе Presenter туралы ештеңе білмейді.
  • View: Мәліметтерді көрсету және пайдаланушымен өзара әрекеттесу үшін жауап береді. Пассивті, шешім қабылдау логикасын қамтымайды. Барлық пайдаланушы әрекеттерін Presenter-ге жүктейді.
  • Presenter: Model мен View арасында делдал ретінде әрекет етеді. Пайдаланушы әрекеттерін өңдейді, Model-ден мәліметтерді алады және View-ді жаңартады. Көрсету логикасын қамтиды.

Артықшылықтары:

  • Жақсартылған тестілеу мүмкіндігі (Presenter логикасы оқшауланған түрде оңай тестіленеді).
  • Жауапкершілікті бөлу.
  • Көрсету логикасын қайта пайдалану (әртүрлі View-да).

Кемшіліктері:

  • Класстар санының артуы.
  • boilerplate-код (View және Presenter интерфейстері).

Өзара әрекеттесу:

  1. View пайдаланушы әрекеттері туралы Presenter-ге хабарлайды.
  2. Presenter Model-мен өзара әрекеттеседі (мәліметтерді алады/сақтайды, бизнес-логиканы орындайды).
  3. Presenter Model-ден нәтиже алады.
  4. 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);
    }
}