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

關于MVC/MVP/MVVM的一些錯誤認識

移動開發 Android
在Android開發中使用MVP和MVVM模式早已不是新鮮事了,各種MVP/MVVM相關的文章、開源庫也已屢見不鮮,甚至是讓人眼花撩亂,那么我為什么還要在這個早已被畫滿涂鴉的黑板上再來涂涂畫畫呢?是想彰顯我的存在感嗎?

在Android開發中使用MVP和MVVM模式早已不是新鮮事了,各種MVP/MVVM相關的文章、開源庫也已屢見不鮮,甚至是讓人眼花撩亂,那么我為什么還要在這個早已被畫滿涂鴉的黑板上再來涂涂畫畫呢?是想彰顯我的存在感嗎?那當然!啊不不不……不完全是!我還想要警醒讀到這篇文章的各位:你們對于MVX的理解可能并不完全正確!

注:這篇文章里我將使用 MVX 做為MVC、MVP以及MVVM的統稱。

我們都知道MVX的進化過程是從滾球獸進化到MVC,然后從MVC進化到MVP,再從MVP超進化到MVVM。那么接下來,按照常規的套路,我應該要介紹什么是MVC,什么是MVP,以及什么是MVVM,并且分別介紹M、V、C/P/VM各自的職責了。

[[280783]]

我的目的是想要糾正一些對MVX的錯誤認識,所以前提是你要對MVX有一些了解。為了避免有人在使用MVX時走上彎路,所以決定對我看到的一些關于MVX的錯誤認識進行總結以及糾正。會產生這些錯誤認知的原因,經我分析,其實是:沒有真正領會到MVX主義的核心價值觀!其實MVX的核心思想也很簡單,不要誤會,不是富強、民主、……而是 將表現層和業務層分離 。

表現層和業務層分離

表現層和業務層分離,Matin Fowler稱之為Separated Presentation。這里的表現層就是VX,業務層就是M。如果有人看到這里發現了和你認為的MVX不一樣的話,那么你對MVX的認識很可能就存在錯誤,嚴重者還可能是走了修正主義路線!

從表現層和業務層分離的視角來看,M、V、X不是平等的身份,應該是M和V-X。自始自終M的職責都沒變,變的是V-X,隨著軟件開發技術的發展、交互形式或者交互媒介的不斷改變,表現層的邏輯也越來復雜,MVX的進化過程就是一個不斷探尋處理表現層復雜邏輯的過程。當然從一個形態進化到另一個形態,并不一定是為了解決更復雜的交互邏輯,也可能是有了一種“更優雅”的方式來處理表現層邏輯。

既然已經有表現層和業務層分離的概念了,那么第一個錯誤觀點就很好解釋了。

錯誤一:Presenter或者ViewModel負責處理業務邏輯

這是一個很常見的錯誤觀點,很多介紹MVP或者MVVM的文章都這么說過。正如前面所說,業務邏輯是屬于M層的,那Presenter或者ViewModel是干什么的,處理表現層邏輯的嗎?是的,或者說大部分表現層邏輯都是在Presenter或者ViewModel中處理的。之前我將業務層之上的這些邏輯稱之為視圖邏輯,現在為了統一就叫做表現層邏輯吧(加個吧字怎么感覺怪怪的)。

我在這里就簡單說一下什么是表現層邏輯,以及View和Presenter/ViewModel又是如何分工的。假設你的應用有一個個人資料的profile頁面,這個頁面有兩種狀態,一種是瀏覽狀態,一種是編輯狀態,通過一個編輯按鈕觸發狀態的轉換,編輯狀態時,部分信息項可以進行編輯。那這里就有一個明顯的表現層邏輯,那就是點擊按鈕切換瀏覽/編輯狀態。

現在的MVP的流行形態(或者變種)叫做Passive View,它和MVVM一樣現在都傾向于將幾乎所有的表現層邏輯交給Presenter或者ViewModel處理,View層需要做的事情很少,基本上就是接受用戶事件,然后將用戶事件傳遞給Presenter或者ViewModel。以上面的profile頁面的例子來解釋的話就是,View層負責接收編輯按鈕的點擊事件,然后通知Presenter/ViewModel,然后Presenter/ViewModel通知View是顯示瀏覽狀態的視圖還是編輯狀態的視圖。MVP的示例代碼大概是這樣的:

  1. public class ProfileView { 
  2.     void initView() { 
  3.         // 負責注冊點擊事件監聽器,并將點擊事件通知給presenter 
  4.         editStateButton.setOnClickListener(new OnClickListener() { 
  5.             presenter.onEditStateButtonClicked(); 
  6.         }) 
  7.         ... 
  8.     } 
  9.  // 顯示瀏覽狀態視圖,想不到好名字,就叫showNormalState吧 
  10.     public void showNormalState() { 
  11.         // 瀏覽狀態下編輯按鈕提示文字為“編輯”,所有項不可編輯 
  12.         editStateButton.setText("編輯"); 
  13.         nickName.setEditable(false); 
  14.         ... 
  15.     } 
  16.     public void showEditState() { 
  17.         // 瀏覽狀態下編輯按鈕提示文字為“完成”,部分項要設置為可編輯 
  18.         editStateButton.setText("完成"); 
  19.         nickName.setEditable(true); 
  20.         ... 
  21.     } 
  22.  
  23.  
  24. public class ProfilePresenter { 
  25.     private State curState = State.NORMAL; 
  26.     public void onEditStateButtonClicked() { 
  27.         // 按鈕被點擊時,根據當前狀態判斷View應該切換顯示的狀態 
  28.         // 這就是表現層邏輯 
  29.         if (isInEditState()) { 
  30.             curState = State.NORMAL; 
  31.             view.showNormalState(); 
  32.         } else { 
  33.             curState = State.EDIT; 
  34.             view.showEditState(); 
  35.         } 
  36.     } 
  37.     private boolean isInEditState() { 
  38.         return curState == State.EDIT; 
  39.     } 
  40.     @VisibleForTest 
  41.     void setState(State state) { 
  42.         curState = state; 
  43.     } 

注:這個示例代碼只是為了展示表現層邏輯,沒有涉及到Model層,編譯也不會通過的!

能感受到我想表達的意思嗎?就是Presenter/ViewModel根據當前交互狀態決定該顯示什么,而View要做的是如何顯示它們。再比如說下拉刷新的場景,由View告訴Presenter/ViewModel,它接收到了下拉事件,然后Presenter/ViewModel再告訴View,讓它去顯示刷新提示視圖,至于這個刷新提示長什么樣就由View來決定。當然Presenter/ViewModel也可能會判斷當前網絡不可用,而讓View顯示一個網絡不可用的提示視圖。

為什么要讓Presenter/ViewModel處理幾乎所有的表現層邏輯呢?主要是為了提高可測試性,將盡可能多的表現層邏輯納入到單元測試的范圍內。因為對視圖控件的顯示等等進行單元測試太難了,所以View是基本上沒法進行單元測試的,但是Presenter/ViewModel是完全可以進行單元測試的:

  1. public class ProfilePresenterTest { 
  2.     private ProfilePresenter presenter; 
  3.     private ProfileView view
  4.     @Test 
  5.     public void testShowEditStateOnButtonClick() { 
  6.         // 瀏覽狀態下點擊編輯按鈕,驗證View是否顯示了編輯狀態視圖 
  7.         // 也就是驗證view.showEditState()方法是否被調用了 
  8.         presenter.setState(State.NORMAL); 
  9.         presenter.onEditStateButtonClicked(); 
  10.         Mockito.verify(view).showEditState(); 
  11.     } 
  12.     @Test 
  13.     public void testShowNormalStateOnButtonClick() { 
  14.         // 編輯狀態下點擊完成按鈕,驗證View是否顯示了瀏覽狀態視圖 
  15.         // 也就是驗證view.showNormalState()方法是否被調用了 
  16.         presenter.setState(State.EDIT); 
  17.         presenter.onEditStateButtonClicked(); 
  18.         Mockito.verify(view).showNormalState(); 
  19.     } 

你看,這些表現層邏輯就都能進行單元測試了吧!大概懂我意思了吧?

[[280784]]

OK,現在你已經知道表現層了,那業務層又是干什么用的呢?現在我們就要開始談到M了。

M是什么?M是指那些喜歡從受虐中獲得性……哎呀,不好意思,搞混了!哎~學識淵博就是麻煩!M者,Model也,再長一點就是Domain Model,中文名字叫領域模型。我們看一下維基百科上對Domain model的定義:

  • In software engineering, a domain model is a conceptual model of the domain that incorporates both behaviour and data.

怎么樣,是不是很通俗易懂呀?當然不是!剛剛開始有點理解Model層是處理業務邏輯的,現在又來了個抖MMM……Domain,我都不知道該往哪里去想了!Domain,簡單點就把它理解成業務,我覺得都沒啥問題。我這里引用這句話,主要是想強調,Model層包含了業務數據以及對業務數據的操作(behaviour and data),也是為了引出第二個錯誤觀點。

錯誤二:Model就是靜態的業務數據

我們做業務模塊開發時,會經常定義一些數據結構類,比如個人資料可能會對應一個UserProfile類,一條訂單數據可能會對應一個Order類,這些類沒有任何邏輯,只有一些簡單的getter、setter方法。有些人會認為像UserProfile或者Order這樣的數據結構類就是Model。

我們已經強調了,Model層包含了業務數據以及對業務數據的操作。像UserProfile或者Order這樣的數據結構類的實例甚至都不能稱之為對象,可以看一下Uncle Bob的Classes vs. Data Structures這篇文章,對象是有行為的,一個數據結構實例沒有行為,連對象都稱不上,怎么能代表Model層呢!

靜態的業務數據不能代表Model層,業務數據以及針對業務數據的操作共同構成了Model層,這也就是業務邏輯。再舉個例子說一下吧,假設你在做一個叫“掘鐵”的app,這個app現在只有一個頁面,用來展示推薦的博客列表。OK,我們如果用MVP的形式該怎么寫呢?我們就先不管和Model層完全沒有交互的View了,Presenter層除了處理表現層邏輯外,還要向Model層發出業務指令,注意,Presenter并不處理業務邏輯,真正的業務邏輯還是由Model層完成。示例代碼大概是下面這樣:

  1. public class RecommendBlogFeedPresenter { 
  2.     private RecommendBlogFeedView view
  3.     private BlogMode model; 
  4.     public void onStart() { 
  5.         view.showLoadWait(); 
  6.         model.loadRecommendBlogs(new LoadCallback<>() { 
  7.             @Override 
  8.             public void onLoaded(List<Blog> blogs) { 
  9.                 view.showBlogs(blogs); 
  10.             } 
  11.         }) 
  12.     } 
  13.  
  14.  
  15. public interface BlogModel { 
  16.     void loadRecommendBlogs(LoadCallback<List<Blog>> callback); 
  17. public class BlogModelImpl implements BlogModel { 
  18.     private BlogFeedRepository repo; 
  19.     @Override 
  20.     public void loadRecommendBlogs(LoadCallback<List<Blog>> callback) { 
  21.         // BlogFeedRepository.fetch()很可能是耗時操作,所以實際寫的時候會在非主線程執行,這里只是示例 
  22.         callback.onLoaded(repo.fetch("recommend")); 
  23.     } 
  24. public interface BlogFeedRepository { 
  25.     List<Blog> fetch(String tag); 

什么?你這個BlogModelImpl里就這一行代碼,你跟我說這是業務邏輯?大家冷靜一下,把手里的板磚、砍刀、狼牙棒先放下來。BlogModelImpl類里面的邏輯雖然簡單,但是它的確是業務邏輯,也正是因為業務邏輯比較簡單,所以BlogModelImpl類才會很簡潔。

再從Presenter的角度看一下,為什么loadRecommendBlogs()屬于業務邏輯。博客這個概念毫無疑問屬于業務概念,根據前面的解釋應該可以判斷出來“獲取推薦的博客列表”不屬于表現層邏輯,那么這個邏輯的實現就不是Presenter需要關心的,那就應該是Model層的職責,既然是Model層的那就應該是業務邏輯了;再者,既然博客是業務概念,那么Blog就是業務數據的數據結構,loadRecommendBlogs()涉及到對業務數據Blog的創建及組裝等操作,所以也應該是業務邏輯。

看到這里,可能有些人會產生一些誤解:所謂的業務邏輯處理就是網絡請求、數據庫查詢等數據獲取邏輯,即Model層就是負責數據獲取的,這也是我要說的第三個錯誤觀點。稍等,我先寫個標題⬇

錯誤三:Model層就是負責數據獲取的

產生這種錯誤認識的,說白了還是沒有搞懂業務邏輯。當然了業務邏輯本身就是很抽象的概念,難理解,也很難區分,我也不敢往細了去說,因為說多了怕被你們發現其實我也是在裸泳。

業務邏輯層并不負責數據的獲取,數據的獲取職責還要在Model層的更下層,這也是為什么我要把的BlogModel的實現邏輯寫得如此簡單,因為數據獲取的職責全部交給了BlogFeedRepository類,Model層只處理業務邏輯。BlogFeedRepository是博客列表的倉儲類,BlogModel通過BlogFeedRepository的fetch()方法獲取標簽為recommend的博客列表,也就是推薦的博客列表。BlogModel不關心BlogFeedRepository是如何獲取對應博客數據的,它可以是從通過網絡請求獲取的,也可以是從本地數據庫中獲取的,數據源有任何改變也不應該影響到BlogModel中的業務邏輯。

那么既然BlogModel中的業務邏輯如此簡單,為什么要強行增加這么一個Model層,而不是讓Presenter直接使用BlogFeedRepository類去獲取數據呢?

當然是有原因的!假設我們剛才介紹的“掘鐵”app,在僅有一個博客列表頁面的情況下,依然吸引了很多用戶去使用,產品經理此時決定嘗試探索變現手段,首先是在博客推薦列表中添加廣告數據。再假設,由于廣告數據和博客數據分屬不同的后端團隊,兩邊數據尚未整合打通,暫時由客戶端負責把廣告數據添加到博客列表中。這個時候,BlogModel終于凸顯了它存在的必要性。表現層不負責廣告數據的獲取與整合,BlogFeedRepository也不能負責廣告數據的獲取與整合。廣告數據的整合是業務邏輯,由BlogModel負責,廣告數據的獲取由專門的數據倉儲類負責。示例代碼如下:

  1. public class BlogModelImpl implements BlogModel { 
  2.     private BlogFeedRepository blogRepo; 
  3.     private AdRepository adRepo; 
  4.     private BlogAdComposeStrategy composeStrategy; 
  5.     private AdBlogTransform transform; 
  6.     @Override 
  7.     public void loadRecommendBlogs(LoadCallback<List<Blog>> callback) { 
  8.         List<BlogAd> ads = adRepo.fetch("recommend"); 
  9.         List<Blog> blogs = blogRepo.fetch("recommend"); 
  10.         // 在這里把廣告數據整合到博客列表中 
  11.         blogs = composeStrategy.compose(blogs, ads, transform); 
  12.         callback.onLoaded(blogs); 
  13.     } 
  14. public interface AdRepository { 
  15.     List<BlogAd> fetch(String tag); 
  16. public interface BlogAdComposeStrategy { 
  17.     List<Blog> compose(List<Blog> blogs, List<BlogAd> ads, AdBlogTransform transoform); 
  18. public interface AdBlogTransform { 
  19.     Blog transform(BlogAd ad); 

考慮到廣告和博客可能有不同的整合策略,可以按需替換不同的實現,所以把整合策略封裝到了BlogAdComposeStrategy接口中。整合策略也屬于業務邏輯,但是因為整合策略的實現細節這里不需要關注,所以我覺得不寫出來也行,反正都是我編的。

這里我想表達的是,獲取廣告數據并將廣告數據整合到博客列表中也是業務邏輯的一部分,如果省略Model層將會造成得把廣告的整合邏輯放到Presenter或者Repository層,這必然都是不合適的。將業務邏輯放到了錯誤的層次里,勢必會造成后續的維護性和擴展性問題。

錯誤四:Model層依賴Presenter/ViewModel層

還有一些人沒有搞清楚Model層和上層的依賴關系,依賴關系寫成了雙向的,這是不對的,業務層不應該依賴表現層,而是應該反過來。

實際上應該是Presenter/ViewModel通過接口的形式依賴Model層,Model層完全不依賴Presenter/ViewModel。就像我前面的示例代碼里一樣,Model層必然不會出現任何presenter這樣的單詞,上層通過觀察者模式來監聽Model層的數據變化(LoadCallback接口也算是一種),Model層也不用關心上層是Presenter還是ViewModel。

最后

讀到這里,不知道你們對MVX的理解是不是更深了些呢?對表現層邏輯、業務邏輯是不是也有了更清晰的認識了呢?

其實關于MVX還有更多可以討論的,比如有些人認為Model層并不是真正處理業務邏輯的地方,它只是業務模塊的一個上層封裝層,我覺得也不無道理,在復雜業務模塊中,業務是存在層次的,MVX中的Model層是所有業務層中的最上層。

還有我剛剛提到的業務層之下還有數據層,這是典型的三層架構的概念,即表現層、業務層和數據層。邏輯存在分層,所以架構也必然要進行分層,MVX可以做為我們從代碼到業務甚至到架構的探索的開端。

 

責任編輯:未麗燕 來源: 安卓巴士
相關推薦

2010-01-15 10:26:08

2013-04-07 10:17:54

WindowsPhon

2017-03-31 20:45:41

MVCMVPMVVM

2020-08-04 10:31:53

JavaScriptthis開發

2011-07-04 08:51:27

編程

2015-06-11 10:33:58

企業級云計算混合云應用

2009-08-13 16:41:12

C#結構

2017-04-01 08:30:00

MVCMVPMVVM

2022-07-31 23:54:24

Linux操作系統

2020-08-20 10:16:56

Golang錯誤處理數據

2021-09-27 15:33:48

Go 開發技術

2021-09-27 10:04:03

Go程序處理

2019-11-18 14:27:01

虛擬化Intel VAMD SVM

2018-03-21 16:19:40

MVCMVPMVVM

2011-07-13 09:13:56

Android設計

2019-09-11 08:52:24

MVCMVPMVVM

2013-04-07 10:40:55

前端框架前端

2009-06-18 09:51:25

Java繼承

2011-07-14 14:15:40

ThreadLocal

2012-09-25 10:03:56

JavaJava封面Java開發
點贊
收藏

51CTO技術棧公眾號

亚洲自拍偷拍网| 日韩精品免费视频一区二区三区| 国产欧美一区二区三区在线老狼| 91精品久久久久久综合乱菊| 国产无码精品在线播放| 欧美猛男同性videos| 777奇米成人网| 国产二区视频在线播放| 美女国产在线| 26uuu成人网一区二区三区| 91精品久久久久久久久久久| 日操夜操天天操| 日韩欧美中字| 精品亚洲aⅴ在线观看| 亚洲制服中文字幕| 日韩欧美看国产| 亚洲成人动漫精品| www.午夜色| 理论视频在线| 懂色中文一区二区在线播放| 亚洲高清不卡在线| 欧美三日本三级少妇三99| 国产免费黄色大片| 久久伊人亚洲| 韩国一区二区电影| 国产黄色小视频网站| 久久成人av| 亚洲第五色综合网| 加勒比av中文字幕| 亚洲精品.com| 欧美色图在线视频| 日韩av中文字幕第一页| 成人短视频在线观看| 国产欧美视频一区二区| 久久久精彩视频| 丁香六月天婷婷| 国产精品一二三四| 成人免费自拍视频| 91成品人影院| 久久99国产精品免费网站| 日本国产精品视频| 亚洲精品中文字幕乱码三区91| 亚洲一级一区| 午夜精品福利电影| 日韩成人免费在线观看| 激情欧美国产欧美| 久久久久久久久电影| 综合五月激情网| 婷婷综合久久| 久久精品电影网站| 精品国产精品国产精品| 综合久久一区| 欧美精品在线播放| 全程偷拍露脸中年夫妇| 欧美在线视屏| 欧美激情精品久久久久| 国产一级片播放| 亚洲片区在线| 欧美一级淫片aaaaaaa视频| 亚州国产精品视频| 亚洲欧美日韩视频二区| 日本久久久久久久| 免费在线不卡av| 蜜臀av一区二区在线免费观看 | 亚洲欧美精品中文字幕在线| 亚洲av无码一区二区二三区| 综合伊思人在钱三区| 亚洲情综合五月天| 超碰人人干人人| 香蕉视频国产精品 | 中文字幕在线中文字幕日亚韩一区| 91大神在线网站| 亚洲视频在线一区观看| 国产成人一二三区| 97人澡人人添人人爽欧美| 欧美日韩国产影院| 亚洲性生活网站| 99综合久久| 精品福利一区二区三区免费视频| 日b视频在线观看| 国产亚洲电影| 另类视频在线观看| 日韩三级视频在线| 日本欧美在线看| 3d动漫精品啪啪一区二区三区免费| www日本视频| 91免费观看视频在线| 亚洲欧洲免费无码| 欧美另类tv| 日本乱人伦一区| 亚洲黄色av片| 九九热hot精品视频在线播放| 亚洲人成77777在线观看网| 男女男精品视频网站| 亚洲天堂成人| 国产精品va在线播放我和闺蜜| 91片黄在线观看喷潮| 成人午夜短视频| 欧美激情第六页| 激情视频在线观看| 岛国av在线不卡| 国内av一区二区| 欧美亚洲国产日韩| 美女黄色丝袜一区| 黄色一级视频免费看| 国产精品一区二区免费不卡| 欧美一区观看| 97在线超碰| 在线电影院国产精品| 岛国精品资源网站| 欧美激情日韩| 国产精品人成电影| 午夜小视频免费| 亚洲男人的天堂在线观看| 成年人视频在线免费| 视频一区日韩| 久久精品影视伊人网| 精品国产一区二区三区四| 国产成人免费视频网站| 亚洲高清精品中出| 久久sese| 日韩精品视频三区| 欧美交换国产一区内射| 黑人巨大精品欧美一区| 色噜噜狠狠一区二区三区| 性欧美18xxxhd| 日韩精品在线一区| 美国一级片在线观看| 老牛国产精品一区的观看方式 | 成久久久网站| 欧美在线观看日本一区| 黄色三级网站在线观看| 一区二区三区在线视频观看58| 成 人 黄 色 小说网站 s色| 欧美日韩国产在线观看网站 | 国产精品巨作av| 九九热99久久久国产盗摄| 一级α片免费看刺激高潮视频| 久久精品欧美一区二区三区麻豆| 欧美不卡在线播放| 国产伦乱精品| 韩国v欧美v日本v亚洲| www.五月婷婷| 亚洲一区二区在线免费观看视频| 天天操夜夜操很很操| 婷婷亚洲图片| 亚洲在线免费视频| 午夜dj在线观看高清视频完整版| 7777精品伊人久久久大香线蕉| 国产91在线播放九色| 麻豆精品视频在线观看视频| 亚洲巨乳在线观看| 欧洲精品久久久久毛片完整版| 色青青草原桃花久久综合| 在线观看中文字幕码| 国产精品视频在线看| 五月天av在线播放| 91精品秘密在线观看| 91网站免费看| 91豆花视频在线播放| 亚洲电影免费观看高清| 日本免费观看视| 久久综合色8888| 色悠悠久久综合网| 亚洲经典一区| 成人av电影免费| 色在线中文字幕| 在线观看国产成人av片| 91久久久久久久久久久久| 日韩毛片视频在线看| 亚洲熟妇一区二区| 国产精品美女久久久| 日韩啊v在线| 国产一区二区三区| 国产最新精品视频| 免费理论片在线观看播放老| 欧美日韩一区中文字幕| 校园春色 亚洲| 91麻豆成人久久精品二区三区| 免费看国产黄色片| 欧美黄污视频| 久久久久网址| 在线视频成人| 91av中文字幕| 日本中文字幕在线2020| 亚洲成人中文字幕| 中文字幕免费在线看| 亚洲一区二区在线免费看| 丰满少妇一区二区| 国产乱对白刺激视频不卡| 久久久999免费视频| 99成人超碰| 精品国产乱码久久久久软件| 欧洲亚洲精品久久久久| 欧美超级免费视 在线| 欧洲一区av| 日韩一区二区三区免费看| 黄色在线观看国产| 中文字幕一区不卡| 精品中文字幕在线播放| 精品一区二区精品| 99热在线这里只有精品| 先锋资源久久| 日本婷婷久久久久久久久一区二区| 日本一区二区乱| 国产精品美女免费看| 超碰97国产精品人人cao| 日韩中文在线中文网三级| 天天操天天干天天操| 3751色影院一区二区三区| 国产成人一级片| 亚洲午夜久久久久久久久电影院| 亚洲毛片亚洲毛片亚洲毛片| 2023国产精品视频| av不卡中文字幕| 激情文学综合插| 日韩一级理论片| 99精品国产99久久久久久福利| 免费看污污视频| 日韩欧美1区| 欧美成熟毛茸茸复古| 伊人久久亚洲| 亚洲最大福利网站| 国产一精品一av一免费爽爽| 国产欧美在线观看| 欧美国产日韩电影| 欧洲精品毛片网站| 欧美freesex黑人又粗又大| 欧美日韩成人黄色| 久久五月精品| 久久精品99国产精品酒店日本| 91社区在线观看| 中文字幕av一区二区| 国产精品一二三区视频| 国产午夜精品久久久| 天天干天天干天天干| 亚洲国产精品99久久| 亚洲欧美激情另类| 精品欧美乱码久久久久久| av网站免费播放| 日韩午夜三级在线| 国产99久一区二区三区a片| 欧美图片一区二区三区| 99re热视频| 精品视频在线视频| 做爰视频毛片视频| 欧美日韩极品在线观看一区| 中文字幕有码视频| 欧美性做爰猛烈叫床潮| 最新中文字幕免费| 91麻豆精品国产91久久久久久久久 | 亚洲激情小视频| 视频一区二区三区国产 | 欧美 日韩 国产 成人 在线观看| 久久久无码精品亚洲日韩按摩| 久久精品国产亚洲av麻豆| 久久欧美中文字幕| 制服 丝袜 综合 日韩 欧美| 日本一区免费视频| 日本少妇aaa| 一区二区三区在线观看网站| 日本a在线观看| 欧美性jizz18性欧美| 波多野结衣黄色| 欧美乱熟臀69xxxxxx| 国产老妇伦国产熟女老妇视频| 日韩欧美卡一卡二| 天天舔天天干天天操| 亚洲情综合五月天| 老司机在线视频二区| 欧美激情亚洲国产| 竹内纱里奈兽皇系列在线观看| 国产成人黄色av| 爱情电影网av一区二区| 国产午夜精品在线| 国产99久久| 日本久久高清视频| 国产一区二区你懂的| 性欧美极品xxxx欧美一区二区| 国内精品在线播放| 国产综合内射日韩久| 国产三级精品视频| 久久97人妻无码一区二区三区| 欧美日韩国产中字| 国产一区二区三区黄片| 亚洲精品成人久久| 婷婷成人激情| 91黄色8090| 91丨精品丨国产| 久久久99爱| 欧美va天堂在线| 黑鬼大战白妞高潮喷白浆| 国产最新精品免费| 国产麻豆天美果冻无码视频 | 精品国产三区在线| 精品在线不卡| 欧美不卡在线| 五月婷婷狠狠操| 成人av免费在线观看| 最新黄色av网址| 丁香五六月婷婷久久激情| 国产日本精品视频| 国产亚洲精品91在线| www欧美xxxx| 成人免费福利在线| 欧美精品久久久久久| 可以在线看的av网站| 国产精品一品二品| 欧美一区二区三区粗大| 亚洲成av人片一区二区梦乃| 国产一区二区三区中文字幕| 伊人久久大香| 色综合男人天堂| 久久亚洲资源中文字| 久久久久网址| 亚洲精品系列| 91福利视频免费观看| 国产精品久久看| 国产99免费视频| 日韩av在线网页| xxxx日韩| 国产精品免费一区| 女同久久另类99精品国产| 天堂а√在线中文在线| 日本视频在线一区| 国产特黄级aaaaa片免| 亚洲成人tv网| 韩国中文字幕hd久久精品| 久久夜色精品亚洲噜噜国产mv| av久久网站| 亚洲国产日韩综合一区| 老司机一区二区三区| 制服丝袜第二页| 欧美小视频在线| 青青草视频在线观看| 欧美一级在线亚洲天堂| 无码少妇一区二区三区| 国产97在线 | 亚洲| 91免费小视频| 天天爽夜夜爽夜夜爽精品| 精品视频久久久| 欧美少妇精品| 欧美在线激情| 日韩高清国产一区在线| 国产视频不卡在线| 欧美日韩中文一区| 秋霞午夜理伦电影在线观看| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久久久| 在线免费看v片| 亚洲欧美激情一区二区| 国产成人精品白浆久久69| 欧美贵妇videos办公室| 综合中文字幕| 欧美亚洲日本一区二区三区| 国产美女免费看| 日韩亚洲欧美中文在线| 精品一区二区三区亚洲| 久久久无码中文字幕久...| 国产传媒一区在线| 日本五十路女优| 亚洲人av在线影院| 四虎地址8848精品| 91精品国产毛片武则天| 99在线精品观看| 狠狠狠狠狠狠狠| 俺去啦;欧美日韩| 99精品国产高清一区二区麻豆| 自拍日韩亚洲一区在线| 国产丝袜在线精品| 91黄色在线视频| 久久久久久有精品国产| 欧美猛男做受videos| 午夜av中文字幕| 五月激情综合婷婷| 成年人在线观看视频| 99高清视频有精品视频| 99伊人成综合| 午夜黄色福利视频| 精品91自产拍在线观看一区| 美脚恋feet久草欧美| 视频一区二区视频| www.亚洲在线| 在线视频 中文字幕| 欧美肥婆姓交大片| 精品精品久久| 一级全黄裸体片| 在线亚洲免费视频| 在线黄色网页| 日本午夜一区二区三区| 国产成人一级电影| 91视频久久久| 欧美另类精品xxxx孕妇| 国产成人1区| 五月天激情小说| 在线电影欧美成精品| 在线观看爽视频| 日本人妻伦在线中文字幕| 久久精品网站免费观看| 亚洲精华国产精华精华液网站|