本框架抽取自本人真實(shí)項(xiàng)目臊恋,持續(xù)維護(hù)了近一年時(shí)間衣洁,不過幾個(gè)月前才真正放到遠(yuǎn)程倉庫。對(duì)于mvp的理解抖仅,從一開始的網(wǎng)上初步了解坊夫,到自己進(jìn)行項(xiàng)目重構(gòu),一路下來僅僅針對(duì)mvp這塊的重構(gòu)大大小小差不多有5,6次的樣子撤卢,也算是略有體會(huì)环凿,特此貢獻(xiàn)出來,希望能對(duì)才開始用mvp或者已經(jīng)使用了mvp框架進(jìn)行開發(fā)的同學(xué)們帶來一絲靈感╮(╯▽╰)╭放吩。
備注:
本框架取自項(xiàng)目智听,所以會(huì)一直維護(hù),不存在停更的情況渡紫,如果有同學(xué)大膽嘗試我的開源框架僻澎,本人也會(huì)盡力滿足大家的要求裕寨,當(dāng)然大家看完后,有什么意見也歡迎在評(píng)論中提出赃承。
再來個(gè)備注:
基于專一職能的原則亚斋,本人的框架沒有集成任何網(wǎng)絡(luò)阁苞,圖片差购,rxJava之類的框架异逐,僅僅引用了一個(gè)動(dòng)態(tài)權(quán)限庫和官方的dataBinding忍抽,這是和大多數(shù)架構(gòu)類框架開源庫的一個(gè)很大的區(qū)別。
開源地址:https://github.com/AcgnCodeMonkey/MVPLibrary
MVP模式擴(kuò)展-->MVPH模式
使用簡(jiǎn)單腌零,易擴(kuò)展梯找,易維護(hù),低耦合益涧,高復(fù)用是MVPH的目標(biāo)
引用方式 :
compile 'com.xujl:BaseLibrary:0.1.2'
架構(gòu)思路簡(jiǎn)介
??MVP的基本思想這里不做過多解釋,有興趣的同學(xué)可以在網(wǎng)上找相應(yīng)資料學(xué)習(xí)一下驯鳖。
??比較深入學(xué)習(xí)過MVP模式的同學(xué)都知道闲询,MVP現(xiàn)在比較大眾的使用方法有兩種:
- 使用activity作為view層,創(chuàng)建一個(gè)presenter和model與之對(duì)應(yīng)浅辙,配合使用扭弧。
-
使用activity作為presenter層,創(chuàng)建一個(gè)view和model與之對(duì)應(yīng)记舆,配合使用鸽捻。
??這兩種方式各有優(yōu)劣,這里不做過多闡述泽腮,本庫采用的是第二種方式實(shí)現(xiàn)御蒲。MVPH與傳統(tǒng)MVP的最大區(qū)別在于邏輯的實(shí)現(xiàn)上。以model為例诊赊,
傳統(tǒng)MVP中通常會(huì)把存儲(chǔ)數(shù)據(jù)的邏輯寫在某些BaseModel中厚满,這樣Presenter需要獲取某些數(shù)據(jù)時(shí)就可以直接調(diào)用
Model中封裝好的對(duì)應(yīng)方法。一般來講這么寫沒有太大問題碧磅,但是特別的碘箍,如果我們遇到某個(gè)特定業(yè)務(wù),需要處理某些
數(shù)據(jù)鲸郊,并且這個(gè)處理有可能還會(huì)出現(xiàn)在其他很多界面丰榴,此時(shí)基于傳統(tǒng)MVP通常會(huì)有兩種方法來解決:
- 因?yàn)橐粋€(gè)Presenter是可以包含多個(gè)Model的,所以讓多個(gè)需要處理這種業(yè)務(wù)的Presenter都引用這個(gè)處理數(shù)據(jù)的Model
- 封裝這段處理業(yè)務(wù)的邏輯成為一個(gè)新的BaseModel秆撮,這樣四濒,其他地方的Model只需要繼承這個(gè)Model就能包含這段業(yè)務(wù)處理能力
??以上兩種方法都有比較致命的問題,第一種方法的問題在于像吻,Presenter雖然可以對(duì)應(yīng)多個(gè)Model峻黍,但是通常每個(gè)Model會(huì)有自己
比較特別的業(yè)務(wù)邏輯,如果直接引用拨匆,會(huì)造成一些不該出現(xiàn)的方法也能被Presenter調(diào)用姆涩,而且采用一個(gè)p對(duì)應(yīng)多個(gè)m,會(huì)造成對(duì)Model管理的復(fù)雜度增加惭每。第二種方法的問題就更明顯了骨饿,繼承已經(jīng)是最大的問題
亏栈,由于Java中類只能單繼承,所以說當(dāng)你繼承了這個(gè)特定業(yè)務(wù)的Model時(shí)就代表無法再去繼承其他類了宏赘,那么問題來了绒北,如果這時(shí)需求變更,
又突然出現(xiàn)一個(gè)需要多次使用的數(shù)據(jù)處理邏輯察署,并且和之前的Model沒有任何聯(lián)系時(shí)闷游,你要怎么辦呢?
??當(dāng)然贴汪,這種問題對(duì)于有一定經(jīng)驗(yàn)的程序猿當(dāng)然是沒有任何難度的脐往,我們通常可以選擇單獨(dú)封裝一個(gè)類來處理一部分特定通用邏輯
扳埂,這樣Model再去引用這個(gè)Helper類就能使用通用的數(shù)據(jù)處理邏輯了业簿。這個(gè)其實(shí)就是大家常說的少用繼承多用組合的設(shè)計(jì)原則。
MVPH的核心思想也正是基于這種思想阳懂,MVP只提供基本的設(shè)計(jì)框架梅尤,實(shí)際的業(yè)務(wù)邏輯(這里特指那些很多界面多次出現(xiàn)的業(yè)務(wù)邏輯)
全部交由每種業(yè)務(wù)對(duì)應(yīng)的ViewHelper,PresenterHelper,ModelHelper去處理具體邏輯岩调,MVP各個(gè)模塊只管調(diào)用Helper
類中幾個(gè)方法就能實(shí)現(xiàn)需要的業(yè)務(wù)巷燥,采用這個(gè)方法把需要復(fù)用的邏輯獨(dú)立與MVP之外的Helper類。
總結(jié)
??總的來說MVPH與傳統(tǒng)MVP的區(qū)別在于誊辉,傳統(tǒng)MVP對(duì)于復(fù)用邏輯的是一個(gè)View對(duì)應(yīng)多個(gè)Presenter或Model(如果是以
Activity為Presenter則是一個(gè)Presenter對(duì)應(yīng)多個(gè)View和Model),而MVPH的思想則是MVP只能一一對(duì)應(yīng)矾湃,即一個(gè)Presenter
(Activity)對(duì)應(yīng)一個(gè)View和一個(gè)Model,對(duì)于需要復(fù)用的邏輯采用組合的方式使用Helper類來實(shí)現(xiàn)堕澄,以達(dá)到邏輯和數(shù)據(jù)甚至視圖的
多次復(fù)用邀跃,同時(shí)每個(gè)helper由mvp每個(gè)對(duì)應(yīng)角色自己管理,這樣蛙紫,一個(gè)model可以只由自己獨(dú)立的邏輯構(gòu)成也可以自主或由Presenter添加某個(gè)通用功能的helper到自己內(nèi)部進(jìn)行功能擴(kuò)展拍屑。
??注意點(diǎn):雖然思想是這樣的,但是我們?cè)诰帉慼elper類的時(shí)候應(yīng)該有自己的把控坑傅,因?yàn)橥ǔelper的編寫就涉及到三個(gè)僵驰,ViewHelper,ModelHelper,PresenterHelper,就像mvp一樣,如果對(duì)于helper劃分的粒度過細(xì)的話唁毒,非常容易造成類爆炸(mvp劃分不好會(huì)造成方法數(shù)爆炸)蒜茴。所以,目前來講浆西,只建議抽離通用性較強(qiáng)或者雖然使用的地方不多粉私,但是邏輯非常復(fù)雜的業(yè)務(wù)邏輯,這樣才能達(dá)到一個(gè)平衡點(diǎn)近零。
框架功能介紹
支持的功能:
ToolBar動(dòng)態(tài)加載.無需每個(gè)布局引用相同的ToolBar布局诺核,只需配置一次ToolBarModule實(shí)現(xiàn)類抄肖。同時(shí),支持每個(gè)activity
單獨(dú)修改ToolBar窖杀。動(dòng)態(tài)權(quán)限管理集成.框架使用了第三方權(quán)限管理庫easypermissions漓摩,需要申請(qǐng)權(quán)限的activity只需要復(fù)寫下面的方法
并返回需要申請(qǐng)的對(duì)應(yīng)權(quán)限數(shù)組即可,當(dāng)然你也可以自己引用其他庫處理權(quán)限入客,這并不會(huì)沖突管毙。
String[] needPermissions ();
- 框架中集成了activity棧管理.可以方便的一鍵退出所有activity或某幾個(gè)activity,具體使用參考ActivityManager類
- 支持關(guān)閉MVP模式進(jìn)行開發(fā).我們都知道痊项,app中某些界面的邏輯有時(shí)候非常簡(jiǎn)單锅风,并且基本上不用過多考慮擴(kuò)展性的問題,這時(shí)鞍泉,使用MVP模式進(jìn)行開發(fā)無疑是臃腫的,因?yàn)槟憧赡懿坏貌粸榱藥仔酗@示數(shù)據(jù)的邏輯去給他寫上幾個(gè)接口和類肮帐。所以MVPH提供了方法可以關(guān)閉MVP模式咖驮,讓你重回MVC模式,通常你只需要復(fù)寫下面的方法并返回false就可以了训枢。而且只需要在你自己的實(shí)現(xiàn)基類稍作處理托修,就算不使用MVP模式,你依然可以使用View和Model調(diào)用他們中基礎(chǔ)方法恒界。
boolean isMVP();//是否使用MVP模式
- 支持DataBinding.從0.1.0版本開始睦刃,正式兼容使用DataBinding進(jìn)行開發(fā)
??由于為了提高框架的自由度與可擴(kuò)展度,所以MVPH本身并沒有封裝太多功能十酣,僅僅提供了基本的MVPH架構(gòu)思路涩拙。不過在demo里
我展示了通過使用MVPH框架為基礎(chǔ)進(jìn)行擴(kuò)展的一個(gè)簡(jiǎn)單套路,目前demo還比較簡(jiǎn)單耸采,打算在后面豐富demo的功能兴泥,主要是涵蓋
開發(fā)者們的大部分業(yè)務(wù)場(chǎng)景,這樣大家在遇到一些特別的界面時(shí)能有一個(gè)參考進(jìn)行開發(fā)虾宇。
交流群:275885217??入群密碼:mvp
友情鳴謝:接口提供-http://gank.io/api
版本更新日志:
更新日期:2017/09/25 庫版本:0.1.2 demo版本:1.5
- presenter新增通過類名反射創(chuàng)建view和model搓彻,可以不用再傳遞類名
- 抽取部分方法到接口
- 修改activity加載流程,采用界面完全可見時(shí)才進(jìn)行邏輯初始化嘱朽,防止初始化時(shí)進(jìn)行popupWindow彈窗引起的異常
- 增加說明文檔
更新日期:2017/09/20 庫版本:0.1.1 demo版本:1.4
- 新增mvp基礎(chǔ)框架支持dataBinding
- 布局加載邏輯統(tǒng)一由BaseViewHelper進(jìn)行控制旭贬,加載配置由新增類LayoutConfig進(jìn)行
控制 - 優(yōu)化view和presenter的部分加載邏輯,去除部分無用方法搪泳,簡(jiǎn)化調(diào)用邏輯
- 修正部分不規(guī)范的方法名稀轨,邏輯復(fù)雜處添加更多注釋
- 修改BaseFragment懶加載的部分代碼
- demo中原dataBinding示例界面,改為直接繼承CommonPresenter,去除之前封裝的
dataBindingPresenter等類 - 新增方法說明文檔(持續(xù)更新森书,逐步完善)
更新日期:2017/09/18 庫版本:0.0.9 demo版本:1.3
- 更改helper基類用法靶端,基礎(chǔ)model谎势,view,presenter杨名,helper類改為繼承BaseMvpHelper
(原BaseHelper)類脏榆,新的BaseHelper類為其他自定義helper類的基類,并且只有
基礎(chǔ)BaseMvpHelper的子類才具有添加BaseHelper類的功能(之前是任意BaseHelper
子類都可以添加),自定義的helper類無法往自己內(nèi)部添加helper類台谍。 - baseView新增findView方法须喂,可以直接調(diào)用,不用再需要使用mRootView,也不需要類型強(qiáng)轉(zhuǎn)
- demo依賴RxLibrary方式變更
- demo資訊新增viewPage+fragment分類趁蕊,增加啟動(dòng)頁面坞生,首頁導(dǎo)航增加二維碼掃描
- demo的AppLibrary新增結(jié)合DataBinding的使用封裝基類,demo中新增結(jié)合DataBinding的使用
示例掷伙,下次更新會(huì)更改為基礎(chǔ)庫支持DataBinding是己。 - 修改基礎(chǔ)庫部分字段訪問權(quán)限
- 下次更新目標(biāo):優(yōu)化ToolBarModule和helper類代碼,優(yōu)化view和presenter的模板代碼任柜,釋放
部分邏輯到helper類中卒废,基類兼容DataBinding
更新日期:2017/09/6 庫版本:0.0.8 demo版本:1.2
- 新增baseview可控制在不使用toobar時(shí)是否為布局添加父布局
- 修復(fù)activity和fragment銷毀時(shí)未清空model和view引用
- demo更新,引入rxjava2,新增RxLibrary,修改demo部分加載邏輯
- demo首頁變更宙地,新增安卓資訊欄目摔认,點(diǎn)擊跳轉(zhuǎn)webview詳情頁,詳情頁采用非mvp編寫
更新日期:2017/07/24 庫版本:0.0.6 demo版本:1.1
- 修改基礎(chǔ)庫BaseView加載判斷,兼容activity和fragment
- 優(yōu)化BaseToolBarModule加載邏輯宅粥,支持頁面本身包含toolbar布局
- 修復(fù)權(quán)限彈窗可以被關(guān)閉的Bug
更新日期:2017/07/14 庫版本:0.0.4 demo版本:1.1
- 修改基礎(chǔ)庫方法加載順序参袱,防止動(dòng)態(tài)授權(quán)時(shí)引起的空指針
- 優(yōu)化toolbar,改為view引用toolbar而不是presenter引用toolbar
- demo新增圖片搜索秽梅,收藏抹蚀,下載功能
更新日期:2017/07/06 庫版本:0.0.3 demo版本:1.0
- 修改exposeActivity方法返回值類型
- 優(yōu)化部分類方法
- 從此版本開始,框架庫接入了我自己的正式項(xiàng)目中
更新日期:2017/07/05 庫版本:0.0.1 demo版本:1.0
- 上傳初步基礎(chǔ)框架
- 完成簡(jiǎn)單demo基礎(chǔ)Library封裝
- 編寫簡(jiǎn)單demo
Licence
Copyright 2016 Shintaro Katafuchi, Marcel Schnelle, Yoshinori Isogai
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.