Favor composition over inheritance.
#示例圖
圖畫的有點(diǎn)丑无蜂,見諒伺糠。簡(jiǎn)單說(shuō)一下,Presenter就是Mvp中的P斥季,View即MVP中的V需要什么功能都由Presenter提供训桶,事實(shí)上Presenter也是借助Usecase來(lái)完成相應(yīng)功能的累驮,Presenter持有完成所有功能的Usecase(注:每一個(gè)Usecase完成一個(gè)功能,比如登錄就是LoginUsecase舵揭,注冊(cè)就是RegisterUsecase)谤专。
? ? ? ? ? 為什么一個(gè)Usecase只完成一個(gè)功能?
1午绳,單一職責(zé)原則置侍。這個(gè)不多說(shuō)。
2箱叁,我傾向于使用組合去完成功能的復(fù)用墅垮,而不是繼承。就像積木耕漱,需要哪個(gè)材料就選取哪個(gè)材料算色,精簡(jiǎn)、高效螟够。因?yàn)樽钚」δ軉挝坏膹?fù)用性才算最大的灾梦。
事實(shí)上,不管View層需要什么功能妓笙,直接調(diào)用presenter.execute(BaseRequest request)方法即可若河。當(dāng)然request是具體的請(qǐng)求對(duì)象,繼承BaseRequest寞宫。也就是說(shuō)一個(gè)request對(duì)應(yīng)Usecase萧福。我們可以在Presenter中維護(hù)一個(gè)UsecaseManager實(shí)現(xiàn)通過(guò)request得到對(duì)應(yīng)的Usecase。
Usecase是一個(gè)抽象類辈赋,上代碼
```
public abstract class Usecase<Q extends BaseRequest,R extends BaseResponse>{
privateSubscriptionmSubscription= Subscriptions.empty();
public void execute(Q request,Observer<R> subscriber){
unsubscribe();
mSubscription= buildUsecaseObservable(request)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
}
protected abstractObservable<R>?buildUsecaseObservable(Q request);
public voidunsubscribe(){
if(!mSubscription.isUnsubscribed()){
mSubscription.unsubscribe();
}
}
}
```
所以實(shí)現(xiàn)一個(gè)Usecase的步驟是繼承Usecase鲫忍,覆寫buildUsecaseObservable方法,通常Usecase需要一個(gè)Repository來(lái)完成相應(yīng)的操作钥屈,就在構(gòu)造函數(shù)中通過(guò)Dagger2注入進(jìn)來(lái)悟民。若是明確只需要通過(guò)網(wǎng)絡(luò)發(fā)起請(qǐng)求埠对,可以直接注入一個(gè)Api弱恒,然后再Api中完成相應(yīng)操作。
本片可能寫的很沒(méi)有邏輯田晚,但是中心思想是使用組合而非繼承竭业,希望對(duì)你有所啟發(fā)智润。