Можно ли создать отдельный интерфейс для функции обратного вызова в шаблоне MVP? - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь создать приложение, используя MVP design pattern. Это первый раз, когда я использую этот шаблон, поэтому меня мало волнует, правильно ли я следую шаблону или нет.

Это то, что я сделал до сих пор. Я не использую Dagger2.

Интерфейс

public interface MainActivityMVP {

    interface Model{
        void sendTokenToServer(MainActivityMVP.Presenter presenter);
    }

    interface View{
        boolean isPnTokenRegistered();
        void tokenUpdated();
        void tokenFailedToUpdate();
    }

    interface Presenter{
        void tokenUpdatedSuccessfully();
        void tokenAlreadyExists();
        void detachView();
    }

На MainActivity я создал экземпляр Presenter и Model и передал объект Model на Presenter Constructor

MainActivity

    public class MainActivity extends BaseActivity implements MainActivityMVP.View {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_base);

            mainPresenter= new MainPresenter(this, new MainModel());
            mainPresenter.sendFCMTokenToServer();
        }

В Presenter я вызываю Model's метод для выполнения операции и передаю presenter ссылку на него.

Presenter

    public class MainPresenter implements MainActivityMVP.Presenter{

        MainActivityMVP.View view;
        MainActivityMVP.Model model;


        public MainPresenter(MainActivityMVP.View view, MainActivityMVP.Model model){
            this.view= view;
            this.model= model;
        }


        public void sendFCMTokenToServer() {
            model.sendTokenToServer(this);
        }

       @Override
       public void tokenUpdatedSuccessfully() {
         view.tokenUpdated();
       }

        @Override
        public void tokenAlreadyExists() {
          view.tokenFailedToUpdate();
        }

В модели я создаю экземпляр класса PreferenceManager, который получает данные из SharedPreference

public class MainModel implements MainActivityMVP.Model {

    PreferencesHelper preferencesHelper;


    public MainModel(){
        preferencesHelper= new PreferencesHelper();
    }

 @Override
    public void sendTokenToServer(MainActivityMVP.Presenter presenter) {

        if (preferencesHelper.getNotificationSettings().isEmpty()) {
           //do stuff

           presenter.tokenUpdatedSuccessfully();
        }
  }

Теперь у меня есть эти вопросы.

  • Является ли вышеуказанный подход к реализации шаблона MVP в порядке, или я здесь чего-то не хватает.

  • Это нормально, если я добавлю другой интерфейс для обратных вызовов или передачи Лучше подходить к моделирующему, так как я видел пример где они проходят interactor ссылка на модель.

  • Нужно ли создавать Interactor Class в шаблоне MVP

  • Это нормально, а не против MVP rule, если я создаю отдельный интерфейс для репозитория,

1 Ответ

0 голосов
/ 03 мая 2018

Разработчики имеют различные варианты реализации MVP. Мало кто использует интеракторы. Не обязательно использовать интеракторы в MVP. Я предложу вам ниже, так как вы находитесь в начальной стадии.

 public interface MainView extends BaseView {
         boolean isPnTokenRegistered();
         void tokenUpdated();
         void tokenFailedToUpdate(); 
}

Тогда пусть ваш базовый представитель будет таким

public interface BasePresenter<V extends BaseView> {

    void setView(V view);

    void destroyView();

    void destroy();
}

Теперь ваш MainPresenter

    public class MainPresenter implements BasePresenter<MainView>{

    MainView view;
    PreferencesHelper preferencesHelper;

   MainPresenter(){
        preferencesHelper= new PreferencesHelper();
   }

      @Override
      public void setView(MainView view) {
        this.view = view;
      }

      @Override
      public void destroyView() {
        this.view = null;
      }

      @Override
      public void destroy() {

      }

       public void sendFCMTokenToServer() {
            //Do whatever you want
        }

    }

Наконец-то сделай так,

public class MainActivity extends BaseActivity implements MainView {

        MainPresenter mainPresenter;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_base);
            mainPresenter= new MainPresenter();
            mainPresenter.attachView(this)
            mainPresenter.sendFCMTokenToServer();

        }
...