精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

最近2019免费中文字幕视频三| 亚洲成人av一区| 国产精品嫩草影院一区二区| 色老板免费视频| 国产日韩三级| 欧美在线播放高清精品| 黄色特一级视频| 久久久pmvav| 精品一区精品二区高清| 久久久久久国产免费| 30一40一50老女人毛片| 不卡一区视频| 欧美视频精品一区| 男女h黄动漫啪啪无遮挡软件| 国产 欧美 精品| 奇米色一区二区| 久久久免费电影| 女同一区二区| 91久久精品国产91性色69| 日韩午夜一区| 久久九九免费视频| 熟女少妇一区二区三区| 日韩在线成人| 欧美三级三级三级爽爽爽| 青青青在线视频播放| 乱人伦中文视频在线| 2023国产一二三区日本精品2022| 亚洲free嫩bbb| 中文字幕av免费观看| 在线亚洲一区| 欧美精品免费在线| 亚洲a∨无码无在线观看| 免费观看成人www动漫视频| 在线播放日韩导航| 免费在线观看的av网站| 日本h片在线| 自拍偷拍国产精品| 婷婷五月色综合| 色视频在线看| 成人国产精品免费观看视频| 亚洲自拍偷拍第一页| 一区精品在线观看| 天堂在线亚洲视频| 欧美有码在线观看视频| 国产 日韩 欧美 成人| 欧美成人久久| 九九热在线精品视频| 黄色片在线观看网站| 99久久这里只有精品| 在线精品播放av| 成都免费高清电影| 国产一区二区三区四区二区 | 久久99精品视频一区97| 国产视频精品免费| 91精品综合久久久久久久久久久| 日日骚av一区| 免费一级suv好看的国产网站| 国产不卡一二三区| 亚洲人成网7777777国产| 人人妻人人藻人人爽欧美一区| 日韩av三区| 亚洲欧洲一区二区三区久久| 在线不卡av电影| 国产成人黄色| 中文字幕国产亚洲| 99热99这里只有精品| 国产精品毛片一区二区在线看| 久久精品国产v日韩v亚洲| 无码黑人精品一区二区| 午夜国产欧美理论在线播放| 九九热在线精品视频| 日本一区二区三区四区五区| 亚洲一区二区免费看| 欧美中文在线免费| 欧美性受xxx黑人xyx性爽| 男女性色大片免费观看一区二区| 成人国产精品久久久| 精品国产av 无码一区二区三区| 国产一区999| 国产视色精品亚洲一区二区| 狠狠色伊人亚洲综合网站l| 国产精品久久久久久久久免费丝袜| 伊人久久大香线蕉av一区| 成年人网站在线| 亚洲成a人片综合在线| 日韩av黄色网址| 亚洲伊人精品酒店| 精品国产乱码久久久久久浪潮| 懂色av粉嫩av蜜乳av| 日韩一区二区在线免费| 欧美乱大交xxxxx另类电影| 日本视频免费在线| 日本不卡不码高清免费观看| 99久久一区三区四区免费| 欧美一区二区视频| 亚洲天堂成人网| 鲁一鲁一鲁一鲁一色| 免费一区二区三区四区| 精品国产3级a| 精品丰满少妇一区二区三区| 精品96久久久久久中文字幕无| 国产91色在线| 狠狠躁日日躁夜夜躁av| 国产精品午夜在线| 亚洲国产成人精品无码区99| 欧美aaa级| 亚洲精品久久7777777| 久草福利资源在线| 欧美一级网站| 亚洲最大av网| 九色视频成人自拍| 亚洲影院在线观看| 无限资源日本好片| 性人久久久久| 欧美高清激情视频| 日韩av免费一区| 欧美日韩高清丝袜| 欧美午夜一区| 国产中文字幕亚洲| 欧洲成人av| 红桃av永久久久| 熟妇无码乱子成人精品| 精品久久久亚洲| 69av在线播放| 成人h动漫精品一区二区无码| 中文字幕乱码久久午夜不卡| 国产综合av在线| 美女精品视频在线| 日韩中文在线中文网在线观看| 亚欧视频在线观看| 国产成人午夜电影网| 亚洲一区影院| 欧美日韩在线精品一区二区三区激情综合| 精品福利在线导航| 加勒比婷婷色综合久久| 妓院一钑片免看黄大片| 日韩伦理三区| 亚洲成人av资源网| 我家有个日本女人| 老司机免费视频一区二区| 欧美不卡三区| av影院在线免费观看| 91精品国产综合久久福利| xxxxx99| 一本色道久久综合| 粉嫩av四季av绯色av第一区 | 亚洲男人的天堂在线播放| 国产无码精品在线观看| 国产成人精品三级| 大桥未久一区二区| 高清一区二区中文字幕| 久久精品电影一区二区| 一级aaaa毛片| 中文字幕一区二区日韩精品绯色| 91欧美视频在线| 日韩一区二区在线免费| 成人黄色生活片| 男人天堂久久久| 欧美日韩精品三区| 国产尤物在线播放| 国产一区二区在线看| 国产日产欧美一区二区| 日韩中文字幕无砖| 国外成人在线直播| 天天干天天色天天| 一本到高清视频免费精品| 国产三级av在线播放| 日韩av网站在线观看| 亚洲三区四区| 欧美视频三区| 91精品国产91久久久久福利| 日韩在线免费看| 欧美午夜理伦三级在线观看| 亚洲女人久久久| 国产成人免费高清| 国产黄页在线观看| 精品国产视频| 亚洲综合精品一区二区| 激情国产在线| 深夜福利国产精品| 性生交大片免费看女人按摩| 天天综合天天做天天综合| 男人操女人动态图| 精品制服美女久久| 成人免费播放器| 红桃成人av在线播放| 成人久久一区二区| 色偷偷色偷偷色偷偷在线视频| 亚洲少妇中文在线| av手机免费看| 色综合天天狠狠| 小泽玛利亚一区二区免费| 成人aa视频在线观看| 黄色在线视频网| 国产精品啊v在线| 视频一区亚洲 | 欧美12av| 亚洲精品一二三**| 国产精品第一第二| 香蕉久久aⅴ一区二区三区| 亚洲美女精品久久| 国产丰满果冻videossex| 色婷婷亚洲一区二区三区| 成熟的女同志hd| 久久人人爽爽爽人久久久| 中文字幕日韩久久| 丝袜亚洲精品中文字幕一区| 国内精彩免费自拍视频在线观看网址 | 欧美日韩在线资源| 亚洲成人xxx| 97国产成人无码精品久久久| 天天操天天干天天综合网| 91香蕉视频污在线观看| 成人午夜在线免费| 亚洲免费黄色网| 日本精品三区| 欧美最猛性xxxx| 日本美女高清在线观看免费| 欧美在线短视频| 日本少妇做爰全过程毛片| 亚洲欧洲韩国日本视频| 一级片手机在线观看| 成人午夜视频在线观看| 色啦啦av综合| 日av在线不卡| 福利在线一区二区三区| 99精品久久久| 欧美精品自拍视频| 欧美日韩精品| 成年在线观看视频| 亚洲欧美在线专区| 亚洲最新免费视频| 久久婷婷蜜乳一本欲蜜臀| 日本高清久久一区二区三区| 日韩有码一区| 久久久久久九九九九| 色婷婷综合久久久久久| 久久国产精品99久久久久久丝袜| 欧美激情影院| 精品免费视频123区| 欧美黑人巨大videos精品| 精品国产免费人成电影在线观...| 丁香婷婷成人| 精品高清视频| 国产aⅴ精品一区二区三区久久| 欧美日韩高清在线一区| 色综合综合网| 日本精品一区二区| 精品国产一区二区三区四区| 性欧美videosex高清少妇| 日韩精品影视| 亚洲 欧洲 日韩| 五月天久久久| 成人精品视频在线播放| 宅男噜噜噜66一区二区| 99久久久无码国产精品6| 日韩激情视频在线观看| 欧美伦理片在线观看| 精品一区二区三区久久久| 亚洲网中文字幕| 国产成人自拍在线| 国产十八熟妇av成人一区| 91麻豆精东视频| 四虎成人免费影院| 综合在线观看色| 国产在线欧美在线| 欧美香蕉大胸在线视频观看| 中国a一片一级一片| 欧美一区二区在线免费播放| 成人免费一级视频| 亚洲欧美中文另类| 国产在线更新| 91超碰中文字幕久久精品| 91p九色成人| 成人精品一二区| 国产欧美日韩精品高清二区综合区| 亚洲欧美丝袜| 激情亚洲成人| 超碰av在线免费观看| 国产福利91精品一区| 性久久久久久久久久久| 中文字幕国产精品一区二区| 久久高清无码视频| 色婷婷av久久久久久久| www.国产视频| 国产亚洲精品久久久久久777| 国产精品久久久久久福利| 78m国产成人精品视频| 性欧美video另类hd尤物| 精品网站在线看| 亚洲综合色站| 国内自拍视频一区| 成人动漫av在线| 国产麻豆a毛片| 色综合久久88色综合天天| 国产强伦人妻毛片| 国产一区二区激情| 2020国产在线| 91亚洲国产成人精品性色| 国产在线日韩精品| 亚洲精品久久久久久久蜜桃臀| 免费成人在线影院| 国产精品无码一区二区三区免费 | 亚洲美女精品成人在线视频| 性爱视频在线播放| 成人免费看吃奶视频网站| 国精一区二区| 国内自拍在线观看| 国产v综合v亚洲欧| 亚洲一级二级片| 欧美在线看片a免费观看| 五月天丁香视频| 精品综合久久久久久97| 欧美日韩伦理一区二区| 日本一区网站| 久久成人精品| 欧美成人三级伦在线观看| 亚洲国产综合人成综合网站| 国产巨乳在线观看| 中文字幕日韩在线观看| 成人开心激情| 欧美二区在线| 亚洲欧美视频| 真人bbbbbbbbb毛片| 欧美三区在线| 久久99精品久久久久久青青91| 日本а中文在线天堂| 国产福利久久| 狠狠色丁香久久综合频道| 国产又粗又猛大又黄又爽| 中文一区二区完整视频在线观看| 国产免费a视频| 亚洲日韩欧美视频| 欧美成a人片在线观看久| 日韩福利影院| 青椒成人免费视频| 美女网站视频色| 欧美人妇做爰xxxⅹ性高电影 | 中文字幕欧美色图| 曰本色欧美视频在线| 中韩乱幕日产无线码一区| 亚洲欧美日韩国产yyy| 久久成人精品无人区| 国产免费一区二区三区四区| 正在播放亚洲一区| 青草av在线| 国产伦精品一区二区三区免| 亚洲精品黄色| 久久久久久久久久久久久久久| 在线这里只有精品| 午夜视频在线观看网站| 91视频国产精品| 激情亚洲网站| 国产熟妇搡bbbb搡bbbb| 欧美又粗又大又爽| 日本高清在线观看wwwww色| 成人免费视频网址| 精久久久久久| 久久成人激情视频| 欧美绝品在线观看成人午夜影视 | 欧美一级大片在线观看| 精品久久久久久久久久久下田| 超碰在线公开97| 亚洲精品国产无套在线观| 内射后入在线观看一区| 欧美一区第一页| 久久精品国产68国产精品亚洲| 伦伦影院午夜理论片| 婷婷夜色潮精品综合在线| 久久精品国产亚洲a∨麻豆| 91九色综合久久| 一本久道久久综合狠狠爱| 亚洲精品视频网址| 精品少妇一区二区三区日产乱码| 亚洲永久av| 超碰在线免费观看97| a级高清视频欧美日韩| 探花国产精品一区二区| 欧美成人高清视频| 少妇高潮一区二区三区| 91插插插插插插插插| 亚洲一区免费在线观看| 伦理片一区二区三区| 91在线无精精品一区二区| 国产精品久久久一区二区| 五月天婷婷丁香网| 精品国产凹凸成av人网站| 91另类视频| 99爱视频在线| 一区二区三区精品视频| 国产在线播放av| 国产精品美女久久久久av福利| 日本欧美一区二区三区乱码| 久久一级黄色片| 中文字幕av一区中文字幕天堂 | 中文字幕在线2019| 欧美成年人网站| av永久不卡| 800av在线播放| 欧美一级高清片在线观看|