简体   繁体   中英

How do I use Repository pattern and Interactor pattern in a Model View Presenter pattern?

I am developing an application with the help of Model View Presenter pattern.

I make use of Retrofit and so I have a ApiClient and ApiInterface with endpoints. I implement the interface in a RemoteDataSource class which I call in the Repository class.

My questions is - how do I make use of an Interactor class to make the repository communicate with the Presenter?

Here is my code until now:

ApiInterface

public interface ApiInterface {

@GET("?")
Call<ArrayList<Movie>> getMoviesByTitle(@Query("t") String title,@Query("apiKey") String apiKey);

}

RemoteDataSource class

private static MovieRemoteDataSource instance;
private final ApiInterface service;

public MovieRemoteDataSource(ApiInterface movieApi) {
    service = ApiClient.createService(ApiInterface.class);
}

public static MovieRemoteDataSource getInstance(ApiInterface movieApi) {
    if (instance == null) {
        instance = new MovieRemoteDataSource(movieApi);
    }
    return instance;
}

@Override
public void getMovies(String title, String apiKey, final LoadMovieCallBack callback) {
    service.getMoviesByTitle(title,apiKey).enqueue(new Callback<ArrayList<Movie>>() {
        @Override
        public void onResponse(Call<ArrayList<Movie>> call, Response<ArrayList<Movie>> response) {
            ArrayList<Movie> movies = response.body();// != null ? //response.body().getTitle() : null;
            if (movies != null && !movies.isEmpty()) {
                callback.onMoviesLoaded(movies);
            } else {
                callback.onDataNotAvailable();
            }
        }

        @Override
        public void onFailure(Call<ArrayList<Movie>> call, Throwable t) {
            callback.onError();
        }
    });
}

DataSource interface with a callback

public interface MovieDataSource {
    interface LoadMovieCallBack{
        void onMoviesLoaded(ArrayList<Movie> movies);
        void onDataNotAvailable();
        void onError();

    }

    void getMovies(String title, String apiKey,LoadMovieCallBack callback);

}

Repository

 private MovieRemoteDataSource movieRemoteDataSource;


public MoviesRepository() {//ApiInterface movieApi) {
    //this.service = ApiClient.createService(ApiInterface.class);
}

public static MoviesRepository getInstance(ApiInterface service) {
    if (instance == null) {
        instance = new MoviesRepository();
    }
    return instance;
}





  public void getMovies(String title, String apiKey ) {
        movieRemoteDataSource.getMovies(title,apiKey,this);
    }

In MoviesRepository you should declare a function with Callback . Your Presenter should implement MovieDataSource.LoadMovieCallBack and pass it when you call MoviesRepository

  public void getMovies(String title, String apiKey,MovieDataSource.LoadMovieCallBack callback) {
        movieRemoteDataSource.getMovies(title,apiKey,callback);
  }

Here is Google MVP already done for todo app sample, you can refer it. But now it deprecated because Google recommends MVVM

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM