Android-Architecture 之 todo-mvp-clean

Domain Layer擁有全部的業務邏輯。Domain層從命名爲User Case或者interactor的類開始,這些類由展現層(Presenter)來使用。這些User Case表明開發人員能夠從展現層(Presenter)執行的全部可能的操做。html

上一篇文章描述了todo-mvp,並着重描述了一下Data層。此次在此基礎上又增長了domain 層。java

按照Android-CleanArchitecture來設計。android

Paste_Image.png

主要概念

與以前項目最大的區別是擴展出了Domain層和許多use case。這將有助於避免Presenter上的代碼重複。git

User Case定義應用程序須要的操做(封裝了請求參數和回調結果基類)。將Data層的方法抽象到了Domain層的類,這增長了可讀性,由於類的名稱可使目的更明顯,見名知義。github

User Case更方便咱們對Domain層的代碼進行重用操做。CompleteTask集成了User Case,TaskDetailPresenter和TasksPresenter都在使用它,獲得了重用。數據庫

這些User Case的執行在後臺線程中使用命令模式來完成。Domain層與Android SDK或其餘第三方庫徹底解耦。網絡

示例代碼

UserCase

/** * Use cases are the entry points to the domain layer. * * @param <Q> the request type * @param <P> the response type */
public abstract class UseCase<Q extends UseCase.RequestValues, P extends UseCase.ResponseValue> {

    private Q mRequestValues;

    private UseCaseCallback<P> mUseCaseCallback;

    public void setRequestValues(Q requestValues) {
        mRequestValues = requestValues;
    }

    public Q getRequestValues() {
        return mRequestValues;
    }

    public UseCaseCallback<P> getUseCaseCallback() {
        return mUseCaseCallback;
    }

    public void setUseCaseCallback(UseCaseCallback<P> useCaseCallback) {
        mUseCaseCallback = useCaseCallback;
    }

    void run() {
       executeUseCase(mRequestValues);
    }

    //調用Data層API,發起請求
    protected abstract void executeUseCase(Q requestValues);

    /** * Data passed to a request. */
    public interface RequestValues {
    }

    /** * Data received from a request. */
    public interface ResponseValue {
    }

    public interface UseCaseCallback<R> {
        void onSuccess(R response);
        void onError();
    }
}複製代碼

雜談

Domain層是對Data層和Presenter層之間的數據處理和操做加工。對於複雜的項目而言,上層UI和底層數據的變更頻繁,致使UI和數據常常對不上號。於是中間層能夠對數據進行一層過濾操做。拿到網絡數據,加工成Presenter層須要的數據便可。dom

同時,將Presenter的方法含義抽象到類中,直觀的顯示功能操做,並封裝了RequestValues和ResponseValue。spa

這一層,既不依賴與Android SDK,也不依賴於第三方庫(網絡庫,數據庫)。線程

相關文章
相關標籤/搜索