拒絕紙上談兵--從維護(hù)了一年的項(xiàng)目中抽取的MVP框架

本框架抽取自本人真實(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)在比較大眾的使用方法有兩種:

  1. 使用activity作為view層,創(chuàng)建一個(gè)presenter和model與之對(duì)應(yīng)浅辙,配合使用扭弧。
  2. 使用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ì)有兩種方法來解決:

  1. 因?yàn)橐粋€(gè)Presenter是可以包含多個(gè)Model的,所以讓多個(gè)需要處理這種業(yè)務(wù)的Presenter都引用這個(gè)處理數(shù)據(jù)的Model
  2. 封裝這段處理業(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)近零。


框架功能介紹

支持的功能:

  1. ToolBar動(dòng)態(tài)加載.無需每個(gè)布局引用相同的ToolBar布局诺核,只需配置一次ToolBarModule實(shí)現(xiàn)類抄肖。同時(shí),支持每個(gè)activity
    單獨(dú)修改ToolBar窖杀。

  2. 動(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 ();

  1. 框架中集成了activity棧管理.可以方便的一鍵退出所有activity或某幾個(gè)activity,具體使用參考ActivityManager類
  1. 支持關(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模式
  1. 支持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ā)虾宇。


1.屬性方法說明

2.部分功能說明

交流群: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.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末风纠,一起剝皮案震驚了整個(gè)濱河市况鸣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌竹观,老刑警劉巖镐捧,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異臭增,居然都是意外死亡懂酱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門誊抛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來列牺,“玉大人,你說我怎么就攤上這事拗窃∠沽欤” “怎么了泌辫?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長九默。 經(jīng)常有香客問我震放,道長,這世上最難降的妖魔是什么驼修? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任殿遂,我火速辦了婚禮,結(jié)果婚禮上乙各,老公的妹妹穿的比我還像新娘墨礁。我一直安慰自己,他們只是感情好耳峦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布恩静。 她就那樣靜靜地躺著,像睡著了一般蹲坷。 火紅的嫁衣襯著肌膚如雪蜕企。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天冠句,我揣著相機(jī)與錄音,去河邊找鬼幸乒。 笑死懦底,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罕扎。 我是一名探鬼主播聚唐,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼腔召!你這毒婦竟也來了杆查?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤臀蛛,失蹤者是張志新(化名)和其女友劉穎亲桦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浊仆,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡客峭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡柿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舔琅。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洲劣,靈堂內(nèi)的尸體忽然破棺而出备蚓,到底是詐尸還是另有隱情课蔬,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布郊尝,位于F島的核電站二跋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏虚循。R本人自食惡果不足惜同欠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望横缔。 院中可真熱鬧铺遂,春花似錦、人聲如沸茎刚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膛锭。三九已至粮坞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初狰,已是汗流浹背莫杈。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奢入,地道東北人筝闹。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像腥光,于是被迫代替她去往敵國和親关顷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,849評(píng)論 25 707
  • 作者:李旺成 時(shí)間:2016年4月3日 “Android MVP 詳解(下)”已經(jīng)發(fā)布武福,歡迎大家提建議议双。 MVP ...
    diygreen閱讀 128,847評(píng)論 86 1,321
  • MVP這種架構(gòu)在Android界已經(jīng)基本成為標(biāo)配,MVP本身也有很多寫法和變種捉片,當(dāng)然平痰,沒有最好的架構(gòu),只有最合適的...
    藍(lán)灰_q閱讀 1,469評(píng)論 0 12
  • 寫在前言:在即將畢業(yè)的一個(gè)晚上,我和N小姐在床上談天說地翻斟,她歷數(shù)著她的小情人逾礁,我回憶著我的小情史。這個(gè)篇章的啟動(dòng),...
    任檸檬閱讀 258評(píng)論 0 1
  • 我想很多人都有這樣的經(jīng)歷:不喜歡現(xiàn)在的工作嘹履,每天都過得不開心腻扇,卻又不得不去上班。 離開當(dāng)然是最好的做法砾嫉,可是很多時(shí)...
    Saraking_閱讀 317評(píng)論 1 1