前言
MVP模式,最早是由Taligent的Mike Pote 提出的眠砾,MVP的提出主要是為了解決MVC模式中結(jié)構(gòu)過于復(fù)雜和模型-視圖耦合性過高的問題。View和Model完全解除耦合励堡。
一刨疼、MVP結(jié)構(gòu)
參照Google官方的DEMO,制定了以下的方案揩慕。我們最終的目的是將復(fù)雜的業(yè)務(wù)邏輯處理與數(shù)據(jù)處理剝離視圖層漩绵,視圖層只作為展示止吐。
![](https://raw.githubusercontent.com/Louis2014/MarkdownPhotos/master/photos/mvp_pic.png)
二瘩燥、分析各個層的作用
以下是項目中實際的代碼分層,每個公司的架構(gòu)分層可能都不一樣二拐,但是原則都是一樣的企软,盡量清晰和相互之間的解耦仗哨,提高可讀性與可維護性厌漂,讓我們快速編完代碼回家陪老婆孩子苇倡。??
![](https://raw.githubusercontent.com/Louis2014/MarkdownPhotos/master/photos/FF51B004-F791-472D-AC9A-823786D9C5FB.png)
- adapter:放置列表的適配器(根據(jù)實際開發(fā)情況而定胜嗓,可以不需要此層)
- base:Activity怔锌、view埃元、presenter等封裝的基類阔拳。
- bean: 數(shù)據(jù)模型类嗤。
- contract: 管理view接口和presenter接口。
- model: 進行網(wǎng)絡(luò)數(shù)據(jù)與本地數(shù)據(jù)處理。
- presenter: 存放presenter弧圆。
- view: 存放activity,fragment搔预。
三斯撮、核心代碼講解
請大家前往我的Github下載源碼,記得幫忙點顆星。網(wǎng)上有很多版本枣氧,作者也是借鑒Google的例子進行了簡單實用的封裝张弛,幫助大家快速應(yīng)用到實際項目中去吞鸭。
- Presenter層封裝
代碼很簡單主要是思路刻剥,將View層(Activity)與Presenter層綁定的公共代碼抽取到基類,目前采用的是弱引用御吞,更好的方式應(yīng)該是Presenter的生命周期長于Activity,后續(xù)我會繼續(xù)優(yōu)化陶珠。
public class BasePresenter<T> {
private WeakReference<T> mWeakReference;
protected WeakReference<T> mTWeakReference;
public void attachView(T view){
mTWeakReference=new WeakReference<T>(view);
}
public void detachView(){
if(mTWeakReference!=null){
mTWeakReference.clear();
}
}
protected T getView(){
return mTWeakReference.get();
}
}
- Activity抽取
代碼依然很簡單栗竖,將activity公共部分抽取出來進行封裝划滋。將創(chuàng)建Presenter步驟交給子類實現(xiàn)根资,分別在Activity創(chuàng)建的時候去綁定View,在Activity
public abstract class BaseActivity<V,T extends BasePresenter<V>> extends AppCompatActivity {
protected abstract int setLayoutId();
protected abstract T createPresenter();
public T presenter;
protected abstract void start();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(setLayoutId());
presenter = createPresenter();
presenter.attachView((V)this);
start();
}
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
}
四玄帕、一起交流學(xué)習(xí)
大家有問題想邦,可以加我的微信和QQ:379323664丧没。