Domain Layer擁有所有的業務邏輯。Domain層從命名為User Case或者interactor的類開始,這些類由展示層(Presenter)來使用。這些User Case代表開發人員可以從展示層(Presenter)執行的所有可能的操作。
上一篇文章描述了todo-mvp,並著重描述了一下Data層。這次在此基礎上又增加了domain 層。
按照Android-CleanArchitecture來設計。
主要概念
與之前專案最大的區別是擴充套件出了Domain層和許多use case。這將有助於避免Presenter上的程式碼重複。
User Case定義應用程式需要的操作(封裝了請求引數和回撥結果基類)。將Data層的方法抽象到了Domain層的類,這增加了可讀性,因為類的名稱可以使目的更明顯,見名知義。
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層需要的資料即可。
同時,將Presenter的方法含義抽象到類中,直觀的顯示功能操作,並封裝了RequestValues和ResponseValue。
這一層,既不依賴與Android SDK,也不依賴於第三方庫(網路庫,資料庫)。