Android 在MVP模式中为回调函数创建单独的接口可以吗

Android 在MVP模式中为回调函数创建单独的接口可以吗,android,performance,android-layout,android-mvp,Android,Performance,Android Layout,Android Mvp,我正在尝试使用MVP设计模式创建一个应用程序。这是我第一次使用这个模式,这就是为什么我很少担心我是否正确地遵循了这个模式 这就是我到目前为止所做的。我没有使用匕首2 接口 public interface MainActivityMVP { interface Model{ void sendTokenToServer(MainActivityMVP.Presenter presenter); } interface View{ boo

我正在尝试使用
MVP设计模式创建一个应用程序。这是我第一次使用这个模式,这就是为什么我很少担心我是否正确地遵循了这个模式

这就是我到目前为止所做的。我没有使用匕首2

接口

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构造函数

main活动

    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上,我调用
模型的
方法来执行操作,并将
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
类的实例,该类从
SharedReference

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模式的方法是好的,还是我好 这里遗漏了一些东西

  • 如果我为回调或传递添加其他接口,可以吗 演示者到模型是更好的方法,正如我已经看到的一些示例 它们传递给模型的
    interactior
    引用的位置

  • 是否有必要在MVP模式中创建
    交互类

  • 如果我创建一个单独的 存储库的接口


开发人员实现MVP的方式多种多样。很少有人使用交互器。在MVP中不强制使用交互器。我会在下面建议你,因为你正处于起步阶段

 public interface MainView extends BaseView {
         boolean isPnTokenRegistered();
         void tokenUpdated();
         void tokenFailedToUpdate(); 
}
那么让你的basepresenter像这样

public interface BasePresenter<V extends BaseView> {

    void setView(V view);

    void destroyView();

    void destroy();
}

感谢@Raja提供的详细答案,
BaseView
是一个标记接口吗?BaseView是一个通用接口,您可以在其中为Context get Context()声明您的函数;错误和重试功能。
    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();

        }