精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android開發中的MVP架構

移動開發 Android
最近越來越多的人開始談論架構。我周圍的同事和工程師也是如此。盡管我還不是特別深入理解MVP和DDD,但是我們的新項目還是決定通過MVP來構建。這篇文章是我通過研究和學習各種文章以及專題討論所總結出來的。

最近越來越多的人開始談論架構。我周圍的同事和工程師也是如此。盡管我還不是特別深入理解MVP和DDD,但是我們的新項目還是決定通過MVP來構建。

這篇文章是我通過研究和學習各種文章以及專題討論所總結出來的,它包括以下幾點:

  • 為什么越來越多的人開始關注架構?
  • 首先,MVP是什么?
  • 哪種架構才是***的,MVC,MVVM還是MVP?
  • MVP的利與弊
  • Show me the code!!!代碼展示

不幸的,這篇文章將不包括:

  • 詳細生動的代碼示例
  • 如何編寫測試代碼

***,我將告訴你如何更進一步學習這些專題。

順便提一下,我于上周在當地的一個研討會上對MVP架構進行了相關演講。這篇文章與當時的演講內容相差無幾。

介紹~Activity是上帝類~

首先,讓我們思考一下為什么在Android開發中如此迫切地需要一個清晰的軟件架構。

該段摘自“代碼大全第二版”:

避免創建神類。避免創建無所不知,無所不能的上帝類。如果一個類需要花費時間從其他類中通過Get()和Set()檢索數據(也就是說,需要深入業務并且告訴它們如何去做),所以是否應該把這些功能函數更好的組織到其它類而不是上帝類中。(Riel 1996)

上帝類的維護成本很高,你很難理解正在進行的操作,并且難以測試和擴展,這就是為什么要避免創建上帝類的黃金法則。

然而,在Android開發中,如果你不考慮架構的話,Activity類往往會越來越大。這是因為,在Android中,允許View和其它線程共存于Activity內。其實***的問題莫過于在Activity中同時存在業務邏輯和UI邏輯。這會增加測試和維護的成本。 

 

 

 

Activity是上帝

這是為什么需要清晰架構的原因之一。不僅會造成Activity的臃腫,還會引起其他問題,如使Activity和Fragment的生命周期變復雜,以及數據綁定等。

什么是MVP?

MVP代表Model,View和Presenter。

  • View層負責處理用戶事件和視圖部分的展示。在Android中,它可能是Activity或者Fragment類。
  • Model層負責訪問數據。數據可以是遠端的Server API,本地數據庫或者SharedPreference等。
  • Presenter層是連接(或適配)View和Model的橋梁。

下圖是基于MVP架構的模式之一。View是UI線程。Presenter是View與Model之間的適配器。UseCase或者Domain在Model層中,負責從實體獲取或載入數據。依賴規則如下: 

 

 

 

The Dependency Injection

關鍵是,高層接口不知道底層接口的細節,或者更準確地說,高層接口不能,不應該,并且必須不了解底層接口的細節,是(面向)抽象的,并且是細節隱藏的。 

 

 

 

The higher interfaces do not know about the details of the lower ones

依賴規則?

Uncle Bob的“The Clean Architecture”描述了依賴的規則是什么。

同心圓將軟件劃分為不同的區域,一般的,隨著層級的深入,軟件的等級也就越高。外圓是實現機制,內圓是核心策略。

這是上面片文章的摘要:

Enitities:

  • 可以是一個持有方法函數的對象
  • 可以是一組數據結構或方法函數
  • 它并不重要,能在項目中被不同應用程序使用即可

Use Cases

  • 包含特定于應用程序的業務規則
  • 精心編排流入Entity或從Entity流出的數據
  • 指揮Entity直接使用項目范圍內的業務規則,從而實現Use Case的目標

Presenters Controllers

  • 將Use Case和Entity中的數據轉換成格式最方便的數據
  • 外部系統,如數據庫或網頁能夠方便的使用這些數據
  • 完全包含GUI的MVC架構

External Interfaces, UI, DB

  • 所有的細節所在
  • 如數據庫細節,Web框架細節,等等

MVC,MVP還是MVVM?

那么,哪一個才是***的呢?哪一個比其他的更優秀呢?我能只選擇一個嗎?

答案是,NO。

這些模式的動機都是一樣的。那就是如何避免復雜混亂的代碼,讓執行單元測試變得容易,創造高質量應用程序。就這樣。

當然,遠不止這三種架構模式。而且任何一種模式都不可能是銀彈,他們只是架構模式之一,不是解決問題的唯一途徑。這些只是方法、手段而不是目的、目標。

利與弊

OK,讓我們回到MVP架構上。剛剛我們了解了什么是MVP,討論了MVP以及其它熱門架構,并且介紹了MVC,MVP和MVVM三者間的不同。這是關于MVP架構利與弊的總結:

**利

  • 可測試(TDD)
  • 可維護(代碼復用)
  • 容易Reviewe
  • 信息隱蔽

**弊

  • 冗余的,尤其是小型App開發
  • (有可能)額外的學習曲線
  • 開始編寫代碼之前需要時間成本(但是我敢打賭,設計架構是所有項目開發所必需的)

show me the code!!!

這里僅展示了MVP模式的一小段結構。如果你想了解更多項目或生動的代碼示例,請參考文章末尾的“鏈接和資源”。那里有非常豐富和設計巧妙的示例,基本都托管在Github上,以便你能clone,在設備上運行,并了解工作原理。

首先,為每一個View定義接口。

  1. /** 
  2.  * Interface classes for the Top view 
  3.  */ 
  4. public interface TopView { 
  5.   
  6.     /** 
  7.      * Initialize the view
  8.      *  
  9.      * e.g. the facade-pattern method for handling all Actionbar settings 
  10.      */ 
  11.     void initViews(); 
  12.   
  13.     /** 
  14.      * Open {<a href="http://www.jobbole.com/members/57845349">@link</a> DatePickerDialog} 
  15.      */ 
  16.     void openDatePickerDialog(); 
  17.   
  18.     /** 
  19.      * Start ListActivity 
  20.      */ 
  21.     void startListActivity(); 
  22.  

讓我們重寫TopView類,要點如下:

  • TopActivity只是負責處理事件監聽或者展示每個視圖組件
  • 所有的業務邏輯必須委托給Presenter類
  • 在MVP中,View和Presenter是一 一對應的(在MVVM中是一對多的) 
  1. public class TopActivity extends Activity implements TopView { 
  2.   
  3.   // here we use ButterKnife to inject views 
  4.   /** 
  5.    * Calendar Title 
  6.    */ 
  7.   @Bind(R.id.calendar_title) 
  8.   TextView mCalendarTitle; 
  9.   
  10.   private TopPresenter mTopPresenter; 
  11.   
  12.   @Override 
  13.   protected void onCreate(Bundle savedInstanceState) { 
  14.       super.onCreate(savedInstanceState); 
  15.       setContentView(R.layout.activity_top); 
  16.       ButterKnife.bind(this); 
  17.   
  18.       // Save TopPresenter instance in a meber variable field 
  19.       mTopPresenter = new TopPresenter(); 
  20.       mTopPresenter.onCreate(this); 
  21.   } 
  22.   
  23.   /* 
  24.    * Overrides method from the {<a href="http://www.jobbole.com/members/57845349">@link</a> TopView} interfaces 
  25.    */ 
  26.   
  27.   @Override 
  28.   public void initViews() { 
  29.       // Actionbar settins 
  30.   
  31.       // set event listeners 
  32.   } 
  33.   
  34.   @Override 
  35.   public void openDatePickerDialog() { 
  36.       DatePickerFragment.newInstance().show(getSupportFragmentManager(), 
  37.               DatePickerFragment.TAG); 
  38.   
  39.       // do not write logic here... all logic must be passed to the Presenter 
  40.       mTopPresenter.updateCalendarDate(); 
  41.   } 
  42.   
  43.   @Override 
  44.   public void startListActivity() { 
  45.       startActivity(new Intent(this, ListActivity.class)); 
  46.   } 
  47.  

這是Presenter類,最重要的一點是Presenter僅僅是連接View與Model的適配橋梁。比如,TopUseCase#saveCalendarDate()是對TopPresenter細節隱藏的,同樣對TopView也是如此。你不需要關心數據結構,也不需要關心業務邏輯是如何工作的。因此你可以對TopUseCase執行單元測試,因為業務邏輯與視圖層是分離的。 

  1. public class TopPresenter { 
  2.   
  3.     @Nullable 
  4.     private TopView mView; 
  5.   
  6.     private TopUseCase mUseCase; 
  7.   
  8.     public TopPresenter() { 
  9.       mUseCase = new TopUseCase(); 
  10.     } 
  11.   
  12.     public void onCreate(@NonNull TopView topView) { 
  13.         mView = topView; 
  14.   
  15.         // here you call View's implemented methods 
  16.         mView.initViews(); 
  17.     } 
  18.   
  19.     public void updateCalendarDate() { 
  20.         // do not forget to return if view instances is null 
  21.         if (mView == null) { 
  22.             return
  23.         } 
  24.   
  25.         // here logic comes 
  26.         String dateToDisplay = mUseCase.getDateToDisplay(mContext.getResources()); 
  27.         mView.updateCalendarDate(dateToDisplay); 
  28.   
  29.         // here you save dateand this logic is hidden in UseCase class 
  30.         mUseCase.saveCalendarDate(); 
  31.     } 
  32.  

當然,盡管業務邏輯被實現在Activity類中,你依然可以執行單元測試,只不過這會耗費很多時間,而且有些復雜。可能需要更多的時間來運行App,相反,你本應該充分利用測試類庫的性能,如Robolectric。

總結

這里沒有***藥,而且MVP也僅僅是解決方案之一,它可以與其他方法協同使用,同樣,也可以有選擇的用于不同項目。

責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2017-02-17 10:07:02

AndroidMVP模式實例

2017-11-29 09:34:03

MVP蘇寧移動

2018-10-29 11:41:22

架構MVCAndroid

2018-12-13 10:37:13

Android開發框架

2011-05-31 08:54:37

Android開發 架構

2011-03-29 13:03:59

IronRubyWindows Pho.NET

2018-06-08 14:06:02

MVP架構Android

2009-07-06 10:36:41

敏捷開發

2024-03-01 08:23:39

2023-02-06 15:24:50

軟件開發MVP功能

2009-04-30 15:56:50

三層架構MVCMVP

2023-04-11 07:50:27

軟件架構設計

2011-01-13 14:29:54

2023-11-08 08:21:52

MVPMVVMMVI

2013-04-03 11:07:34

Android開發良好習慣有用習慣

2009-05-30 09:29:52

AndroidGoogle移動OS

2013-06-25 11:06:07

Android開發顏色定義方法

2014-06-18 14:41:26

AndroidHandler總結

2011-05-26 15:22:57

Android Activity

2023-11-06 13:17:53

ServiceAndroid
點贊
收藏

51CTO技術棧公眾號

国产婷婷精品| 3p视频在线观看| 亚洲人人精品| 亚洲第一男人av| 日本a在线免费观看| 一级黄色大片网站| 亚洲一区色图| 亚洲第一中文字幕在线观看| 国产精品videossex国产高清| www.国产视频| 中文在线一区| 在线国产精品播放| 日本高清一区二区视频| 色爱综合区网| 91丨porny丨首页| 国产精品美女免费看| 中文字幕资源站| 高清日韩中文字幕| 色综合色综合色综合色综合色综合| 日本一区二区三区免费看| 中文字幕第2页| 激情婷婷欧美| 在线观看免费高清视频97| 日韩欧美色视频| 中文字幕乱码在线播放| 国产精品色呦呦| 国产精品区一区二区三含羞草| 亚洲 欧美 成人| 国产精品久久久久久久久久10秀 | 国产午夜精品视频免费不卡69堂| 国产精品一区二区小说| 在线heyzo| 国产日本欧洲亚洲| 国产精品麻豆免费版| 国语对白做受69按摩| 综合一区二区三区| 亚洲一级免费视频| 欧美一级片在线免费观看| 88xx成人免费观看视频库| 亚洲一级电影视频| 亚洲电影免费| 色视频免费在线观看| 韩国午夜理伦三级不卡影院| 欧美激情欧美狂野欧美精品| 国产一区二区三区精品在线| 免费看久久久| 日韩欧美国产电影| 日韩一区二区三区不卡视频| 欧美亚洲日本精品| 一区二区久久久久久| 亚洲一区二区在线免费观看| 奇米影视888狠狠狠777不卡| 成人激情午夜影院| 亚洲xxxxx性| 亚洲男人的天堂在线视频| 国产综合自拍| 久久综合网hezyo| 国产馆在线观看| 国产一区二区精品久| 精品国产伦理网| 亚洲一区二区中文字幕在线观看| 丁香婷婷久久| 在线中文字幕一区| 欧美一级黄色片视频| gogo久久| 亚洲观看高清完整版在线观看| 黄色污污在线观看| 91精彩视频在线观看| 国产日韩欧美综合在线| 免费av一区二区三区| 无码人妻熟妇av又粗又大| 国产色综合网| 8090成年在线看片午夜| 亚洲免费激情视频| 欧美99在线视频观看| 欧美成人剧情片在线观看| 黑人狂躁日本娇小| 一区二区影院| 欧美国产第二页| 久久久.www| 欧美日韩一区二区国产| 久久久噜久噜久久综合| 国产一级片网址| 亚洲经典在线看| 欧美性受xxxx白人性爽| 日本中文字幕久久| 日韩av中文字幕一区二区三区| 国产精品成人一区| 中文字幕一区二区三区波野结| 日韩在线播放一区二区| 国产精品露脸av在线| 91丨porny丨在线中文 | www成人在线视频| 在线观看av一区二区| 少妇一级淫免费放| 涩涩涩久久久成人精品| 欧美日韩国产综合久久| 欧洲美女亚洲激情| 北条麻妃在线一区二区免费播放 | 中文字幕资源站| 欧美视频不卡| 51精品在线观看| 中国老头性行为xxxx| 国产一区在线视频| 好吊妞www.84com只有这里才有精品| 在线观看xxx| 国产精品视频一区二区三区不卡| 国产精品h视频| 婷婷在线播放| 欧美性少妇18aaaa视频| 亚洲va在线va天堂va偷拍| 一区中文字幕电影| 亚洲精品国产综合久久| 免费黄色片网站| 999久久久91| 久久免费精品视频| 欧美videossex极品| 久久国产欧美日韩精品| 亚洲综合中文字幕68页| 清纯唯美亚洲色图| 亚洲天堂av一区| 国产精品免费入口| 国内不卡的一区二区三区中文字幕| 日韩精品一区二区三区老鸭窝 | 欧美一区二区三区啪啪| 五月天激情小说| 色婷婷亚洲mv天堂mv在影片| 午夜精品久久久久久久99热| 在线观看日批视频| 成人av电影在线观看| 国产精品久久精品视| 第一福利在线| 亚洲成人精品影院| 老司机久久精品| 天天躁日日躁成人字幕aⅴ| www.欧美精品| 97人妻一区二区精品视频| 粉嫩嫩av羞羞动漫久久久| 亚洲激情一区二区| 亚洲深夜视频| 欧美精品乱码久久久久久按摩| 亚洲色图14p| 欧美日韩三级| 国产精品高清在线观看| 性xxxx视频播放免费| 一二三四区精品视频| 亚洲成人天堂网| 亚洲欧洲美洲国产香蕉| 69视频在线免费观看| 日本黄色三级视频| 亚洲6080在线| 小毛片在线观看| 99视频精品| 精品91免费| 精品捆绑调教一区二区三区| 亚洲国产一区二区三区在线观看 | 国产区在线视频| 日本韩国欧美一区| 中文字幕伦理片| 麻豆精品一区二区综合av| 亚洲成人一区二区三区| 成人在线观看免费播放| 日韩亚洲精品视频| 国产精品无码天天爽视频| 亚洲视频一区二区在线| 亚洲一区二区三区四区精品| 午夜国产精品视频免费体验区| 91在线网站视频| 99热国产在线| 亚洲国产精品成人va在线观看| 久久夜色精品亚洲| 国产亚洲综合性久久久影院| 我要看一级黄色大片| 手机亚洲手机国产手机日韩| 亚洲伊人久久综合| 国产极品人妖在线观看| 日韩av在线网站| 亚洲精品无码久久久久| 中文字幕欧美一| 风韵丰满熟妇啪啪区老熟熟女| 亚洲国产一区二区三区高清| 久久久水蜜桃| 欧美日韩免费电影| 欧美大片免费观看| 精品999视频| 欧美精品一卡二卡| 国产在线视频在线观看| 久久午夜国产精品| 亚洲va在线va天堂va偷拍| 黄色精品一区| 奇米影视首页 狠狠色丁香婷婷久久综合| yiren22亚洲综合| 欧美精品久久久久a| 欧美日韩国产综合视频| 欧美精品色综合| 激情五月色婷婷| 国产精品美女久久久久aⅴ | 久久精品国产清自在天天线| 人妻无码一区二区三区久久99| 日本道色综合久久| 丰满少妇高潮久久三区| 91蜜桃婷婷狠狠久久综合9色| 不卡的在线视频| 午夜宅男久久久| 玖玖精品在线视频| 蜜乳av综合| 国产精品swag| 精品176极品一区| 6080yy精品一区二区三区| 日本视频不卡| 亚洲欧美激情一区| 国产黄a三级三级三级| 一本到一区二区三区| 免费在线观看av网址| 国产精品丝袜在线| 朝桐光av一区二区三区| 国产一区二区三区在线观看精品 | 欧美久久天堂| 久久人体大胆视频| 黄色在线视频观看网站| 精品欧美久久久| 亚洲特级黄色片| 欧美色xxxx| 国产在线综合网| 亚洲精品菠萝久久久久久久| 中文字幕第24页| 99久久99久久精品免费观看| avtt中文字幕| 国产在线精品免费av| 激情内射人妻1区2区3区| 1024成人| 久久国产精品视频在线观看| 亚洲国产成人精品女人| 亚洲精品在线免费| 成人综合一区| 色女孩综合网| 免费一区二区三区视频导航| 精品毛片久久久久久| 伊人久久大香线蕉av超碰| 91在线观看免费高清| 国产精品久久久久久妇女| 国产91色在线|免| 新版的欧美在线视频| 午夜精品在线视频| 超黄网站在线观看| 久久久久久久久久久91| 四虎影视国产在线视频| 欧美高跟鞋交xxxxhd| 人人超在线公开视频| 欧美大胆在线视频| av黄在线观看| 欧美黑人性视频| 日本动漫理论片在线观看网站| 久久影院资源网| 欧美私人网站| 日韩视频―中文字幕| 麻豆av在线免费看| 久久这里只有精品视频首页| 国产美女av在线| 久久成人人人人精品欧| 国产精品一卡二卡三卡| 欧美成年人视频| 色呦呦在线看| 91国在线精品国内播放| 悠悠资源网亚洲青| 国产精品wwwwww| 九七电影院97理论片久久tvb| 国产欧洲精品视频| 日韩中文字幕一区二区高清99| 成人欧美一区二区三区视频| 久久九九热re6这里有精品| 九色综合日本| 日本一区二区在线看| 中文网丁香综合网| 亚洲视频碰碰| 欧美激情国产精品日韩| 日韩高清国产一区在线| 制服丝袜中文字幕第一页| 国产精品自拍av| 无码精品一区二区三区在线播放 | 51精品免费网站| 亚洲自拍偷拍av| 日韩 国产 欧美| 91精品国产全国免费观看| 蜜臀久久99精品久久久| 亚洲欧洲免费视频| 黄色av免费在线| 国外视频精品毛片| 亚洲欧洲日本韩国| 91色视频在线观看| 清纯唯美亚洲经典中文字幕| 日韩在线导航| 亚洲一级特黄| 国产 porn| 成人av在线播放网址| 懂色av粉嫩av浪潮av| 亚洲国产精品自拍| 伊人精品在线视频| 亚洲精品国产福利| 日本天堂在线观看| 78色国产精品| 蜜桃在线一区| 日本一区二区三区四区在线观看| 久久久久久久久丰满| 1024av视频| 国产精品亚洲一区二区三区妖精 | 亚洲同性gay激情无套| 天堂网av手机版| 91精品国产欧美一区二区18| 可以直接在线观看的av| 九色91av视频| 日韩欧乱色一区二区三区在线| 久草精品电影| 好吊视频一区二区三区四区| 成年人三级黄色片| 99re热视频这里只精品| 丰满少妇被猛烈进入一区二区| 色噜噜狠狠色综合中国| 秋霞网一区二区| 久久成人这里只有精品| 国产成人毛片| 免费一区二区三区在在线视频| 欧美视频成人| 久久艹这里只有精品| 国产精品理伦片| 69亚洲精品久久久蜜桃小说 | 偷拍日韩校园综合在线| 国产又粗又猛又爽又黄视频 | 手机看片国产日韩| 欧美性色19p| 日韩精品123| 色综合久久88| 亚洲电影一区| 视色,视色影院,视色影库,视色网| 理论片日本一区| 亚洲精品成人av久久| 日韩欧美精品中文字幕| 亚洲欧美丝袜中文综合| 国语自产精品视频在线看| 超碰地址久久| avav在线播放| 国产xxx精品视频大全| 久久久久亚洲av无码专区体验| 欧美日韩视频第一区| p色视频免费在线观看| 国产成人综合一区二区三区| 最新国产一区| 91在线视频观看免费| 国产亚洲成年网址在线观看| 99精品人妻国产毛片| 亚洲视频在线观看网站| 日韩精品专区| 视频一区二区精品| 蜜臀久久99精品久久久久久9| 欧美午夜激情影院| 在线视频国内自拍亚洲视频| youjizz在线播放| 国产欧洲精品视频| 中文字幕一区二区三区欧美日韩| 亚洲热在线视频| 亚洲一二三四在线| 亚洲 小说区 图片区 都市| 日本久久久a级免费| 欧美精品系列| 色噜噜狠狠一区二区| 亚洲日本电影在线| 亚洲国产精品久久久久久6q| 午夜精品久久久久久久99热浪潮| 亚洲第一二三区| 亚洲福利精品视频| 亚洲欧美一区二区在线观看| www.五月婷婷| 日av在线播放中文不卡| 欧美色图激情小说| 午夜免费一级片| 亚洲国产精品影院| 欧美zzoo| 91久久国产精品| 在线欧美三区| 国产高潮呻吟久久| 91精品国产品国语在线不卡| 爱情岛亚洲播放路线| 欧美凹凸一区二区三区视频| 久久精品久久综合| 国产真实乱人偷精品视频| 日韩精品www| av国产精品| 日韩少妇内射免费播放| 欧美国产精品中文字幕| 精品国产99久久久久久宅男i| 97视频在线看| 成人在线免费观看网站| 手机免费看av片| 在线观看日韩电影| 黄色污污视频在线观看| 天天爽天天狠久久久| 成人精品电影在线观看| 亚洲天堂aaa| 538国产精品视频一区二区| 天天色综合色|