MVP - сравнение Presenter: представление внедрено в конструктор против takeView (View v) / dropView () - PullRequest
0 голосов
/ 27 ноября 2018

Я видел два подхода к паттерну MVP в Android.Оба используются в Чертежах архитектуры Android :

public interface Contract {
    interface View {
        void showData(String data);
    }

    interface StartVersionPresenter {
        void start();
    }

    interface DropViewVersionPresenter {
        void takeView(View view);
        void dropView();
    }
}

1) Презентатор, в который представление внедряется через конструктор :

public class StartVersionPresenter implements Contract.StartVersionPresenter {

    private final Contract.View view;
    private final Repository repository;

    public StartVersionPresenter(Contract.View view, Repository repository) {
        this.view = view;
        this.repository = repository;
    }

    @Override
    public void start() {
        loadData();
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                view.showData(someData);
            }
        });
    }
}

start() вызывается в методе onResume() Fragment.

2) Презентатор, в котором представление внедряется с помощью метода (takeView в моем примере) :

public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
    private final Repository repository;
    private Contract.View view;

    public DropViewVersionPresenter(Repository repository) {
        this.repository = repository;
    }


    @Override
    public void takeView(Contract.View view) {
        this.view = view;
        loadData();
    }

    @Override
    public void dropView() {
        view = null;
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                if (view != null)
                    view.showData(someData);
            }
        });
    }
}

takeView(Contract.View view) вызывается в методе Fragment onResume().dropView() вызывается в методе Fragment onDestroy().

В обоих случаях ведущий создается в методе Fragment * onCreate().

Почему второйподход используется в большем количестве случаев, чем первый?Я вижу, что первое проще, потому что нам не нужно проверять, что представление не является нулевым, если мы хотим вызвать метод для него.

...