MVP + Repository Pattern

No Silver Bullets

Frederick P. Brooks

1986

Many Problems

Design

Performance

Quality

Architecture

Tools

Examples

Examples

Examples

Many bullets, any silver bullet

Really Simple App

MVC Conventional

View

Controler

Model

MVC Conventional

Init View

Show Progress

Fetch

Show Stories

Show Error

Retry

Create Intent

Launch Intent

And what if the client says...

Likes

Filters

Landscape

Offline

Animations

Single Responsability

Services

Repositories

Presenters

View
Controllers

Dependency Inversion

View
 Controller

Yo modifico la vista

public interface View{
        void setProgressVisible(boolean visible);

        void showStories(List<TopStory> stories);

        void showRequestError();

        void launchActivity(Intent intent);
    }

Presenter

Yo tomo las decisiones

public interface UserActionListener{
        void requestTopStories();

        void storyDetail(TopStory item);
}

Repository

Yo consigo los datos, tengo fuentes confiables

public interface TopStoriesRepository {

    interface FetchStoriesCallback {
        void onSuccess(List<TopStory> stories);

        void onError(Throwable t);
    }

    void fetchTopStories(FetchStoriesCallback callback);
}

Services

Fuentes de datos

public interface TopStoriesApiService {

    interface TopStoriesApiCallback<T>{
        void onLoaded(T stories);

        void onError(Throwable t);
    }

    void fetchTopStories(
        TopStoriesApiCallback<List<TopStory>> callback);
}

public interface TopStoriesLocalService {

    interface TopStoriesLocalCallback<T>{
        void onLoaded(T stories);

        void onError(Throwable t);
    }

    void getLastTopStoriesSaved(
        TopStoriesLocalCallback<List<TopStory>> callback);
}

Services

Repositories

Presenters

View
Controllers

requestTopStories()
showProgress(true)
fetchTopStories(...)
fetchTopStories(...)
onLoaded(...)
onSuccess(...)
showStories(stories)

Services

Repositories

Presenters

View
Controllers

requestTopStories()
showProgress(true)
fetchTopStories(...)
fetchTopStories(...)
onError(...)
lastStoriesSaved(...)
onError(...)
onError(...)
showRequestError(...)

Trabajando con flavors

productFlavors {
        mock {
            applicationIdSuffix = ".mock"
        }

        prod {

        }
    }

Mock

Prod

Service Implementation

mRetrofitApiService.fetchTopStories()
    .enqueue(new Callback<TopStoriesResponse>() {
    @Override
    public void onResponse(Response<TopStoriesResponse> response, 
                            Retrofit retrofit) {
        callback.onLoaded(response.body().getStories());
    }
    
    @Override
    public void onFailure(Throwable t) {
        if (BuildConfig.DEBUG)
            t.printStackTrace();
    
        callback.onError(t);
    }
});
List<TopStory> dummyStories = new ArrayList<>();

for (int i = 0; i < 10; i++) {
    dummyStories.add(new TopStory());
}

callback.onLoaded(dummyStories)

Injection

public class Injection {

    public static TopStoriesRepository 
                    provideTopStoriesRepository(){

        return TopYorkRepositories
                .getTopStoriesRepository(
                TopStoriesApiClient.getInstance(),
                TopStoriesLocalServiceImpl.getInstance());
    }
}

FAQ

That's it!

silmood

@silmood

MVP + Repository Pattern

By Petter Hdz

MVP + Repository Pattern

  • 1,626