代码之家  ›  专栏  ›  技术社区  ›  Taha Kirmani

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

  •  1
  • Taha Kirmani  · 技术社区  · 7 年前

    我正在尝试使用创建应用程序 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 并通过 模型 反对 Presenter Constructor

    主要活动

        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();
            }
    

    我呼叫演示者 Model's 方法执行操作,并通过 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 回复  |  直到 7 年前
        1
  •  2
  •   Raja Jawahar Edward Vaghela    7 年前

    开发人员有不同种类的MVP实现。很少有人使用Interactor。在MVP中不强制使用Interactor。我会在下面给你建议,因为你正处于起步阶段。

     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();
    }
    

    现在是您的主要演示者

        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();
    
            }