android mvp模式有什么弊端
才開(kāi)始學(xué)習(xí)使用MVP時(shí),看到大家說(shuō)了很多MVP的優(yōu)點(diǎn),代碼復(fù)用,條理清晰等等。不過(guò)我改下來(lái)發(fā)現(xiàn),MVP在我看來(lái),最大的優(yōu)點(diǎn)還是代碼解耦,邏輯清晰,至于代碼復(fù)用,暫時(shí)沒(méi)有感覺(jué)很好用,除非是界面和邏輯基本一樣的,不然想要復(fù)用,其實(shí)不太現(xiàn)實(shí)。
MVP的優(yōu)點(diǎn)很明顯,缺點(diǎn)其實(shí)也很明顯,明顯項(xiàng)目會(huì)多出許多類(lèi),增加了項(xiàng)目的復(fù)雜程度,而且像某些邏輯及其簡(jiǎn)單,事件較少的界面,使用MVP實(shí)際上反而是累贅,明明用MVC也就幾十行代碼的事,改成MVP多了好多個(gè)類(lèi),反而感覺(jué)不劃算,改需求時(shí)又要翻閱好多個(gè)類(lèi)。因此,我建議大家,如果你的某個(gè)界面極其簡(jiǎn)單,其實(shí)就不要用MVP了,MVP是邏輯越復(fù)雜,優(yōu)勢(shì)越明顯,邏輯簡(jiǎn)單時(shí),反而不如MVC好用,希望大家不要為了用MVP而用MVP。
下面來(lái)談?wù)勎恼轮黝},MVP的優(yōu)化問(wèn)題,最開(kāi)始采用網(wǎng)上大家的寫(xiě)法,發(fā)現(xiàn)代碼的復(fù)用性不好,有些邏輯類(lèi)似的代碼,基本上每個(gè)presenter 和model都要重新寫(xiě),于是想到使用Base類(lèi)的方法,把某些共有的方法抽離以達(dá)到代碼的復(fù)用性,類(lèi)似于BaseActivity。
舉個(gè)例子比如網(wǎng)絡(luò)請(qǐng)求,在MVC中通常是把網(wǎng)絡(luò)請(qǐng)求封裝在BaseActivity中,不過(guò)既然是MVP,網(wǎng)絡(luò)請(qǐng)求自然應(yīng)該封裝在Model里面啦
public abstract class BaseActivityModel implements IPublicModel {
//網(wǎng)絡(luò)連接模式,當(dāng)一個(gè)頁(yè)面含有多個(gè)網(wǎng)絡(luò)請(qǐng)求時(shí),通過(guò)傳入不同的模式,選擇相應(yīng)的加載參數(shù)
public static final int MODE_ONE=1;
public static final int MODE_TWO=2;
public static final int MODE_THREE=3;
//網(wǎng)絡(luò)連接工具接口類(lèi)
protected InternetConnect mConnect;
/**
* @param mode 請(qǐng)求模式
* @param intent 上個(gè)頁(yè)面?zhèn)鬟f過(guò)來(lái)的intent
* @param i 請(qǐng)求回調(diào)
* @param parameter 請(qǐng)求的一些參數(shù)
*/
@Override
public void requestData (int mode, Intent intent, JsonI i, String.。。 parameter) {
HashMap《String, String》 map = new HashMap《》();
JsonBean.Payload payload=new JsonBean.Payload();
mConnect.loadParameter(intent,mode,payload,map,parameter);//加載參數(shù),由子類(lèi)實(shí)現(xiàn)
map.put(“payload”, VolleyConnect.getGson().toJson(payload));
VolleyConnect.getInVolleyConnect().getServiceMsg( map,i);//封裝Volley,傳入?yún)?shù)以及回調(diào)接口
}
/**
* 設(shè)置網(wǎng)絡(luò)請(qǐng)求
*/
@Override
public void setMConnect (InternetConnect mConnect) {
this.mConnect=mConnect;
}
}
同樣的共有的方法和字段抽象出presenter的基類(lèi)
public abstract class BaseActivityPresenter《T extends IPublicView, E extends IPublicModel》 implements IPublicPresenter {
protected T view;
protected E model;
protected RequestResult mRequestResult;
protected Handler mHandler;
public BaseActivityPresenter (T view) {
this.view = view;
Type type = getClass().getGenericSuperclass();//使用反射實(shí)例化Model
Type trueType = ((ParameterizedType) type).getActualTypeArguments()[1];
try {
this.model = ((Class《E》) trueType).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
new TimeCount(200, 50, new ITimeCount() {
@Override
public void isRuning (long millisUntilFinished) {
}
@Override
public void isFinish () {
init();//加載子類(lèi)方法,延時(shí)200毫秒加載
}
}).start();
}
/*
設(shè)置網(wǎng)絡(luò)請(qǐng)求回調(diào)
*/
public void setRequestResult (RequestResult requestResult) {
mRequestResult = requestResult;
}
/*
獲取view的handler,需要傳入一個(gè)回調(diào)接口
*/
public void setHandler (IHandler handlerI) {
mHandler = view.exposeHandler(handlerI);
}
@Override
public void requestData (final int mode, String.。。 parameter) {
view.setLoading(true);
model.requestData(mode, view.exposeIntent(), new JsonI() {
@Override
public void notice (JsonBean bean) {
// if (bean.getStatus().equals(“0”)) {
// mRequestResult.requestDataSuccess(mode,bean);
// }else{
// mRequestResult.requestDataFail(mode,bean);
// }
view.setLoading(false);
}
@Override
public void notice (int error) {
view.showError(error);
}
}, parameter);
}
}
這樣我們就可以更加簡(jiǎn)單方便的使用MVP模式了,下面是使用示例
public class LoginPresenter extends BaseActivityPresenter《ILoginView,LoginModel》 implements ILoginPresenter, RequestResult {
public LoginPresenter (ILoginView view) {
super(view);
}
@Override
public void init () {
setRequestResult(this);
}
@Override
public void requestDataSuccess (int mode, JsonBean bean) {
}
@Override
public void requestDataFail (int mode, JsonBean bean) {
}
}
可以看到,LoginPresenter不再需要去寫(xiě)model字段和網(wǎng)絡(luò)請(qǐng)求邏輯,通過(guò)泛型,可以自動(dòng)創(chuàng)建model,而網(wǎng)絡(luò)請(qǐng)求,僅僅需要設(shè)置對(duì)應(yīng)的回調(diào)就可以噠。
總結(jié),這樣做進(jìn)一步降低了代碼耦合,方便以后代碼維護(hù),而且整個(gè)MVP感覺(jué)更加簡(jiǎn)單。
評(píng)論