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

軟件架構編年史:MVC及其變種

開發 架構
不久以前,我還為一家公司工作過,其核心業務應用是擁有數千家公司客戶的 SaaS 平臺。這個至關重要的應用已經開發了三年,代碼文件中混雜著 HTML、CSS、業務邏輯和 SQL。果然,在發布兩年之后,公司決定完全重寫這個應用。

[[392479]]

 本文轉載自微信公眾號「逸言」,作者覃宇 。轉載本文請聯系逸言公眾號。  

創建可維護的應用始終是構建應用的真正的長期挑戰。

不久以前,我還為一家公司工作過,其核心業務應用是擁有數千家公司客戶的 SaaS 平臺。這個至關重要的應用已經開發了三年,代碼文件中混雜著 HTML、CSS、業務邏輯和 SQL。果然,在發布兩年之后,公司決定完全重寫這個應用。盡管這些情況時有發生,但如今我們許多人都知道這是不對的以及該如何避免。

然而,在20世紀70年代,職責混雜還是常見的實踐,人們還在尋找更好的解決辦法。隨著應用程序復雜度的增長,修改 UI 必然也會引起業務邏輯的修改,修改越發復雜,耗費的時間也越來越多,還可能帶來更多的問題(因為修改的代碼更多了)。

MVC 因此應運而生,它提出前端和后端之間的“關注點分離”來解決上述問題。

1979 – Model-View-Controller

為了解決上述問題,Trygve Reenskaug 于1979 年提出了 MVC 模式來分離關注點,將 UI 和業務邏輯隔離。該模式當時被應用于1973 就已經出現的桌面圖形界面的開發。

MVC 模式將代碼拆分成了三個概念單元:

  • 代表業務邏輯的 Model (模型);
  • 代表 UI 控件的 View (視圖):按鈕、文本框等等;
  • 在視圖和模型之間居中協調的 Controller(控制器),這意味著:
    • 它決定顯示哪些視圖以及哪些數據;
    • 它將用戶操作(例如點擊按鈕)轉換成業務邏輯。

模型可以是單個對象(相當無趣),也可以是對象組成的某種結構。——Trygve Reenskaug 1979, MVC

最初的 MVC 模式還有其它一些需要了解的的重要概念:

  • View 直接使用 Model 數據對象來展示數據;
  • 當 Model 發生變化時,會觸發一個事件立即更新 View(記住,1979年還沒有 HTTP);
  • 每一個 View 通常只關聯一個 Controller;
  • 每個界面可以包含多對 View 和 Controller;
  • 每個Controller 可以對應多個 View。

現在我所熟知的 HTTP 請求響應范式并沒有使用最初的 MVC 風格。這是因為,按照原始的設想,數據從 View 流向 Controller,這和我熟悉的一樣,但另一邊,數據直接從 Model 流向 View,并沒有經過 Controller。

而且,在現在的請求響應范式中,當數據庫中的數據發生變化時,并不會觸發瀏覽器中展示 View 的更新(盡管可以用 Web Socket 實現)。要看到更新后的數據,用戶需要發起一次新的請求,而更新的數據總是會通過 Controller 返回。

1987/2000 – PAC/Hierarchical Model-View-Controller

PAC 又稱 HMVC,在 UI 片段控件化的上下文中它能帶來更好的模塊化拆分。

例如,我們會發現 View 的一部分被其它一些 View 以同樣的格式使用,甚至直接就在同一個 View 重復使用。一個實際的例子就是網頁展現 RSS 訂閱內容的片段,它可以被其它頁面重用。

如果使用 HMVC,處理主請求的 Controller 會將子請求轉發給其它 Controller 讓這些控件進行渲染,然后在主 View 的渲染中合并它們。

在 HTTP 請求/響應范式的上下文里,我自己也曾遇到過幾次這種情況,但我發現了一個更簡單的方法,即讓 UI 向可以渲染控件的 Controller 發起 AJAX 調用。在保持模塊化優勢的同時并沒有增加嵌套 Controller 調用帶來的復雜性,另一個優勢就是這些子請求可以使用像 Varnish 這樣的緩存。

1996 – Model-View-Presenter

MVC 模式給當時的編程范式注入了一劑強心針。然而,隨著應用程序復雜度的增加,需要更進一步地解耦。

1996 年,IBM 的子公司 Taligent 公開了他們基于 MVC 的 模式 MVP。其思想是將 Model 對 UI 的關注更徹底地分離:

  • View 是被動的,對 Model 無感知;
  • 專注于輕量 Controller(Presenter),它們不包含任何業務邏輯,只是簡單地調用命令和/或查詢模型,將原始數據傳遞給 View;
  • 數據的變化不會直接觸發 View 的更新:它始終要通過 Presenter,由 Presenter 來更新 View。這樣在更新視圖之前 Controller(Presenter) 還可以執行一些和展現相關的額外邏輯。例如,同時更新另一些數據,它們和數據庫中發生變化的數據有關;
  • 每個 View 對應一個 Presenter。

這更接近我所見到的現在的請求/響應范式:數據流始終要經過 Controller/Presenter。不過,Presenter 仍然不會主動更新視圖,它始終需要執行一次新的請求才能讓變化可見。

MVP 中的 Presenter 又被稱為 Supervisor Controller。

2005 – Model-View-ViewModel

由于應用程序的復雜性還在增加,2005 年微軟的 WPF 和 Silverlight 架構師 John Gossman 又提出了 MVVM 模式,目標是進一步將 UI 設計從代碼中分離出來,并提供 View 到數據模型的數據綁定機制。

[MVVM] 是 [MVC] 的變種,專為現代 UI 開發平臺設計。現代 UI 開發中,View 是由設計師負責而不是由傳統意義上的開發者負責。[…] 開發應用程序 UI 使用的工具、語言以及使用它們的人都和業務邏輯以及數據后端有著天壤之別。——John Gossman 2005, Introduction to Model/View/ViewModel pattern

Controller 被 ViewModel “取代”:

[View] 對鍵盤快捷鍵進行編碼,而且控件自行管理與輸入設備的交互,這本該是 MVC 中的 Controller 的職責(現代 GUI 開發中 Controller 的變化說來話長...我認為它只是淡出了開發者的實現。它始終都存在著,而我們不需要像1979年那樣去思考它)。——John Gossman 2005, Introduction to Model/View/ViewModel pattern

MVVM 背后的思想是:

  • ViewModel 和 View 一一對應;
  • 將 View 中的邏輯轉移到 ViewModel 來簡化 View;
  • View 使用的數據和 ViewModel 中的數據一一對應;
  • 將 ViewModel 中的數據綁定到 View 中的數據上,這樣 ViewModel 中數據的變化會立即體現在 View 上。

和最初的 MVC 模式的情況相仿,對傳統的請求/響應范式來說這種方法是行不通的,因為 ViewModel 無法主動地更新 View(除非使用 Web Socket),而 MVVM 對這一點是有要求的。還有,根據我的經驗,ViewModel 的屬性和 View 使用的數據做到完全匹配并不是 Controller 的常見實踐。

Model-View-Presenter-ViewModel

當構建云原生的復雜企業應用時,我傾向于將應用的 UI 結構合理地設計成 M-V-P-VM,這里的 View Model 是 Martin Fowler 在 2004 年提出的 Presentation Model,。

Model

一組包含業務邏輯和用例的類。

View

一個模板,模板引擎用它來生成 HTML;

ViewModel(又叫做 Presentation Model)

從查詢中接收(或者從 Model 實體中提取)原始數據,持有這些會模板會用到的數據。它還要封裝復雜的展現邏輯,來簡化模板。我發現運用 ViewModel 十分重要,因為我們絕不會想在模板中使用實體。這樣我們才能將 View 和 Model 完全隔離開:

  • Model 中的變化(比如實體結構的變化)會上升并影響 ViewModel,但不會影響模板;
  • 復雜的展現邏輯被封裝到了 ViewModel 之中,因此不會被泄露(例如,在業務實體中創建一些只和展現邏輯有關的方法)到領域之中;
  • 模板的依賴變得很清晰,因為它們必須在 ViewModel 中設置。例如,暴露出依賴可以幫助我們決定應該優先從數據庫中加載哪些內容來避免 N+1 問題。

Presenter

接收 HTTP 請求,觸發命令或查詢,使用查詢返回的數據、ViewModel、模板和模板引擎生成 HTML 并將它返回給客戶端。所有 View 的交互都要經過 Presenter。

下面是我實現的一個非常簡單的例子:

  1. <?php 
  2. // src/UI/Admin/Some/Controller/Namespace/Detail/SomeEntityDetailController.php 
  3. namespace UI\Admin\Some\Controller\Namespace\Detail; 
  4. // use ... 
  5. final class SomeEntityDetailController 
  6.     /** 
  7.      * @var SomeRepositoryInterface 
  8.      */ 
  9.     private $someRepository; 
  10.    
  11.     /** 
  12.      * @var RelatedRepositoryInterface 
  13.      */ 
  14.     private $relatedRepository; 
  15.     /** 
  16.      * @var TemplateEngineInterface 
  17.      */ 
  18.     private $templateEngine; 
  19.     public function __construct( 
  20.         SomeRepositoryInterface $someRepository, 
  21.         RelatedRepositoryInterface $relatedRepository, 
  22.         TemplateEngineInterface $templateEngine 
  23.     ) { 
  24.         $this->someRepository = $someRepository; 
  25.         $this->relatedRepository = $relatedRepository; 
  26.         $this->templateEngine = $templateEngine; 
  27.     } 
  28.     /** 
  29.      * @return mixed 
  30.      */ 
  31.     public function get(int $someEntityId) 
  32.         $mainEntity = $this->someRepository->getById($someEntityId); 
  33.         $relatedEntityList = $this->relatedRepository->getByParentId($someEntityId); 
  34.         return $this->templateEngine->render( 
  35.             '@Some/Controller/Namespace/Detail/details.html.twig'
  36.             new DetailsViewModel($mainEntity, $relatedEntityList) 
  37.         ); 
  38.     } 

M-V-C-VM_-_Controller_example.php

  1. <?php 
  2. // src/UI/Admin/Some/Controller/Namespace/Detail/DetailsViewModel.php 
  3. namespace UI\Admin\Some\Controller\Namespace\Detail; 
  4. // use ... 
  5. final class DetailsViewModel implements TemplateViewModelInterface 
  6.     /** 
  7.      * @var array 
  8.      */ 
  9.     private $mainEntity = []; 
  10.     /** 
  11.      * @var array 
  12.      */ 
  13.     private $relatedEntityList = []; 
  14.     /** 
  15.      * @var bool 
  16.      */ 
  17.     private $shouldDisplayFancyDialog = false
  18.     /** 
  19.      * @var bool 
  20.      */ 
  21.     private $canEditData = false
  22.     /** 
  23.      * @param SomeEntity $mainEntity 
  24.      * @param RelatedEntity[] $relatedEntityList 
  25.      */ 
  26.     public function __construct(SomeEntity $mainEntity, array $relatedEntityList) 
  27.         $this->mainEntity = [ 
  28.             'name' => $mainEntity->getName(), 
  29.             'description' => $mainEntity->getResume(), 
  30.         ]; 
  31.         foreach ($relatedEntityList as $relatedEntity) { 
  32.             $this->relatedEntityList[] = [ 
  33.                 'title' => $relatedEntity->getTitle(), 
  34.                 'subtitle' => $relatedEntity->getSubtitle(), 
  35.             ]; 
  36.         } 
  37.          
  38.         $this->shouldDisplayFancyDialog = /* ... some complex conditional using the entities data ... */ ; 
  39.          
  40.         $this->canEditData = /* ... another complex conditional using the entities data ... */ ; 
  41.     } 
  42.     public function getMainEntity(): array 
  43.         return $this->mainEntity; 
  44.     } 
  45.     public function getRelatedEntityList(): array 
  46.         return $this->relatedEntityList; 
  47.     } 
  48.     public function shouldDisplayFancyDialog(): bool 
  49.         return $this->shouldDisplayFancyDialog; 
  50.     } 
  51.     public function canEditData(): bool 
  52.         return $this->canEditData; 
  53.     } 

M-V-C-VM_-_ViewModel_example.php

模板和 ViewModel 一一對應,意味著 View 只能被一個特定的 ViewModel 使用,反過來也一樣。這會讓我進一步思考,也許我們可以將模板和 ViewModel 封裝成一個 View 對象,更有效地將 Controller 和模板以及 ViewModel 解耦,讓它只依賴一個通用的 View 接口;但我還沒有機會實驗這個想法。

總結

在網上,我們還能找到其它 MVC 的變種。但是,這里列出是我覺得更有意義和/或與我的工作有關的一些模式。

然而,我在本文中引用的這些模式是為桌面應用程序和/或富客戶端的上下文創建的,因此它們不是總能和請求/響應范式百分之百的匹配。

如果你開發的是云原生的企業應用并且使用了 MVC,實際上你多半使用的是更接近 MVP 的某種模式。但無論如何,我想表達的不是應該尊崇某種特定的 MVC 變種或是刻板地理解它們的名字,而是我們應該學習所有的模式,按照需要去使用和調整它們。還是那句老話,最終目標就是高內聚低耦合:關注點分離。

 引用來源

  • 1979 – Trygve Reenskaug – MVC XEROX PARC 1978-79
  • 1979 – Trygve Reenskaug – MVC
  • 1987 – Joelle Coutaz – PAC, an Object Oriented Model for Dialog Design
  • 1996 – Mike Potel – MVP: Model-View-Presenter: The Taligent Programming Model for C++ and Java
  • 2000 – Jason Cai, Ranjit Kapila, Gaurav Pal – HMVC: The layered pattern for developing strong client tiers
  • 2003 -Trygve Reenskaug – The Model-View-Controller (MVC): Its Past and Present
  • 2004 -Martin Fowler – Presentation Model
  • 2005 – John Gossman – Introduction to Model/View/ViewModel pattern for building WPF apps
  • 2006 – Martin Fowler – Supervising Controller
  • 2006 – Martin Fowler – GUI Architectures
  • 2011 – Mārti?? Tere?ko – Architecture more suitable for web apps than MVC?
  • 2017* – Tracy-Gregory J. Gilmore – Never the twain shall meet. The tale of MV*
  • 2017* – Tech notes – MVVM vs MVP vs MVC: The differences explained
  • 2017* – Wikipedia – Model–view–controller
  • 2017* – Wikipedia – Presentation–abstraction–control
  • 2017* – Wikipedia – Model-view-presenter
  • 2017* – Wikipedia – Hierarchical model–view–controller
  • 2017* – Wikipedia – Model–view–viewmodel
  • 2018* – Wikipedia – History of the graphical user interface

覃宇,Android開發者/ThoughtWorks技術教練//譯者,熱衷于探究軟件開發的方方面面,從端到云,從工具到實踐。喜歡通過翻譯來學習和分享知識,譯作有《Kotlin實戰》、《領域驅動設計精粹》、《Serverless架構:無服務器應用與AWS Lambda》和《云原生安全與DevOps保障》。

[[392480]]

 

責任編輯:武曉燕 來源: 逸言
相關推薦

2021-03-26 07:47:18

單體架構程序

2021-06-09 08:09:05

架構軟件整潔

2012-06-11 15:29:14

OpenStack

2021-04-30 09:16:08

軟件架構命名

2015-07-17 13:27:06

2011-07-20 09:19:47

SQL Server

2019-01-23 17:37:58

華為

2012-12-21 15:32:32

Linux Deepi

2014-12-12 14:55:42

移動惡意代碼移動安全

2012-03-30 11:34:52

Linux Deepi

2014-10-29 14:43:05

2014-05-20 17:26:06

2013-10-31 14:31:09

2011-08-08 09:25:55

2025-01-23 09:07:51

2023-09-06 06:46:40

顯卡接口RTX 4060

2015-12-16 10:11:14

2020-08-21 13:54:24

瀏覽器程序員內核

2009-09-22 08:14:23

2014-05-09 11:19:38

iOS移動互聯網
點贊
收藏

51CTO技術棧公眾號

中文字幕在线一区| 天堂av在线一区| 亚洲精品一区二区三区福利 | 日韩亚洲国产精品| 亚洲人成欧美中文字幕| 亚洲一二三av| 9999精品成人免费毛片在线看 | 肉色超薄丝袜脚交69xx图片| 日韩一二三区| 色婷婷久久99综合精品jk白丝| 自拍另类欧美| 男同在线观看| 国产成人综合在线观看| 国产精品www| 国产成年人免费视频| 欧美顶级大胆免费视频| 亚洲成人三级在线| 一区二区三区欧美精品| 高清不卡av| 午夜精品视频在线观看| 中文字幕一区二区三区四区五区| 清纯唯美亚洲色图| 国产不卡高清在线观看视频| 成人av在线天堂| 五月婷婷激情视频| 亚洲国产专区校园欧美| 欧美xxxx14xxxxx性爽| 国产aaaaaaaaa| 免费观看成人www动漫视频| 在线综合+亚洲+欧美中文字幕| 丰满爆乳一区二区三区| 麻豆蜜桃在线| 亚洲六月丁香色婷婷综合久久| 日韩欧美一区二区在线观看| 日韩精品系列| 99久久久精品| 国产精华一区二区三区| 精品国产黄色片| 久久狠狠亚洲综合| 国产精品欧美在线| 国产精品第5页| 一区二区三区四区五区在线| 久久人91精品久久久久久不卡| 91在线播放观看| 久久人人99| 日韩中文字幕免费| av片在线免费看| 欧美在线电影| 一区二区三区视频免费在线观看| 男人操女人动态图| 精品freesex老太交| 夜夜嗨av色综合久久久综合网| 国产美女喷水视频| 精品一区亚洲| 亚洲午夜久久久久久久| 91激情视频在线观看| 加勒比久久综合| 亚洲天堂影视av| 久久久免费看片| 999成人网| 伦理中文字幕亚洲| 欧美国产日韩在线观看成人| 自拍偷拍欧美| 色综合久综合久久综合久鬼88 | 色爱综合区网| 一区二区三区久久| 国产极品尤物在线| 欧美gv在线观看| 色综合中文综合网| 日日躁夜夜躁aaaabbbb| av在线精品| 日韩欧美一级片| 超碰caoprom| 校花撩起jk露出白色内裤国产精品| 亚洲毛片在线观看| 日本一二三不卡视频| 久久久久久美女精品 | 日本在线视频中文字幕| 国产亚洲精品v| 国产精品成人播放| 91精品国产乱码久久久| 国产91精品一区二区麻豆网站 | 日本电影全部在线观看网站视频| 1区2区3区精品视频| 久久99久久99精品| 美女福利一区二区 | 免费观看黄色av| 91蝌蚪国产九色| 亚洲一区二区三区在线观看视频| av在线导航| 岛国av一区二区| 欧美激情第3页| 久久久久影视| 中文字幕日韩精品在线观看| 精品少妇theporn| 天堂蜜桃91精品| 444亚洲人体| 毛片在线免费| 一区二区三区四区亚洲| 亚洲爆乳无码专区| 亚洲午夜免费| 夜夜躁日日躁狠狠久久88av| 精品一区免费观看| 蜜臀av一级做a爰片久久| 不卡视频一区| 尤物网址在线观看| 欧美日韩国产中文字幕| 色婷婷激情视频| 九九视频精品全部免费播放| 欧美日韩成人在线视频| 91黑人精品一区二区三区| 国产成人亚洲综合色影视| 日本一区免费看| 国产丝袜在线播放| 欧美精品乱码久久久久久按摩 | 亚洲精品免费一区亚洲精品免费精品一区| 国产精品网站在线看| 中文字幕久热精品在线视频| 国产精品30p| 国产一区二区不卡| 日韩欧美国产二区| 亚洲精品国产精品国产| 精品国产123| 成人免费视频网站入口::| 日韩精品高清不卡| 久久久久久国产精品mv| 黄页网站大全在线免费观看| 91精品国产综合久久香蕉麻豆| 久久久久久久久久久久久久久| 亚洲精选在线| 国产精品日本一区二区| 97超碰资源站在线观看| 欧美精品 日韩| 99精品全国免费观看| 日韩黄色免费网站| 麻豆亚洲一区| 性xxxxfreexxxxx欧美丶| 亚洲成人a**站| 久久久一区二区三区四区| 国产乱人伦偷精品视频免下载| 在线观看欧美亚洲| 少妇高潮一区二区三区99| 一区国产精品视频| 樱花视频在线免费观看| 国产亚洲综合性久久久影院| 日韩av一二三四| 国产精品久久久久久久久久白浆| 欧美大秀在线观看| www.com在线观看| 一区二区三区在线免费观看| 男插女视频网站| 欧美日韩 国产精品| 亚洲自拍偷拍区| 男男gaygays亚洲| 欧美不卡一区二区三区| 国产精彩视频在线| av在线不卡免费看| 国模吧无码一区二区三区| 亚洲丝袜啪啪| 国产精品久久久久久亚洲调教 | 国模吧一区二区三区| 黑人精品一区二区| 亚洲成人av免费| 黄色国产在线观看| 久久精品三级| 一区二区三区国产福利| 精品视频一区二区三区| 欧美精品激情视频| 熟妇高潮一区二区高潮| 91黄色激情网站| 蜜桃av免费在线观看| 精品一区二区综合| 青青在线视频免费观看| 偷拍精品福利视频导航| 国产精品免费久久久久影院| 成人免费在线| 亚洲第一色中文字幕| 无码视频一区二区三区| 一区视频在线播放| 9191在线视频| 久久在线精品| 日本黄色播放器| 狼人天天伊人久久| 国产精品久久久久久久久久免费 | 韩国一区二区在线播放| 国产精品v一区二区三区 | 图片区亚洲欧美小说区| αv一区二区三区| 欧美日韩大片| 欧美精品一区二区免费| 日本中文字幕一区二区有码在线| 欧美丰满少妇xxxbbb| 国产成人精品a视频一区| 国产欧美日本一区二区三区| 中文字幕一区二区三区人妻在线视频| 亚洲一区视频| 黑人巨大国产9丨视频| 欧美成人午夜77777| 国产这里只有精品| 91九色国产在线播放| 在线观看国产精品91| 亚洲国产综合网| 在线视频亚洲一区| 久久久精品91| 中文字幕欧美日韩一区| 日本一区二区在线观看视频| 日韩av中文在线观看| 国产女主播自拍| 欧美韩日一区| 美乳视频一区二区| 一区二区三区四区视频免费观看| 国产精品国产亚洲伊人久久 | 亚洲欧美大片| 欧美久久久久久久久久久久久久| 成人午夜国产| 久久精品二区| 国产调教精品| 97超碰人人模人人爽人人看| 日日夜夜一区| 国产精品91在线观看| 欧美调教sm| 久久久久久久久久久亚洲| 米奇精品一区二区三区| 国产一区二区日韩| 亚洲av成人精品毛片| 欧美变态tickling挠脚心| 97在线播放免费观看| 欧美在线不卡视频| 免费看日批视频| 亚洲午夜视频在线| 欧美丰满熟妇bbbbbb| 国产精品久久久久久久久动漫| 精品人妻无码一区二区三区换脸 | 国产精品一区二区亚洲| 久久精品水蜜桃av综合天堂| 亚洲熟女乱综合一区二区三区| 国产不卡视频一区二区三区| 亚洲国产欧美日韩在线| 毛片av中文字幕一区二区| 亚洲老女人av| 免费看日韩精品| 国产免费又粗又猛又爽| 人人超碰91尤物精品国产| 欧美伦理视频在线观看| 日韩制服丝袜av| 北条麻妃视频在线| 石原莉奈在线亚洲二区| 中文字幕在线导航| 日本vs亚洲vs韩国一区三区二区 | 男女视频免费看| 亚洲五码中文字幕| 亚洲一区二区91| 精品久久久久久久久久国产| 西西44rtwww国产精品| 色综合色综合色综合色综合色综合| 国产精品免费精品一区| 在线观看国产日韩| 91精品国自产| 欧美一区日本一区韩国一区| 精品国产亚洲一区二区麻豆| 欧美成人女星排名| 五月婷婷开心中文字幕| 亚洲欧美一区二区三区在线| 不卡在线视频| 精品国模在线视频| 国精一区二区三区| 欧美在线免费看| 国产成人午夜性a一级毛片| 成人xxxxx| 国产精品xxxav免费视频| 蜜桃av久久久亚洲精品| 日本不卡二三区| 好色先生视频污| 日韩视频免费| 能看的毛片网站| 国产酒店精品激情| 中文字幕免费高清视频| 国产人久久人人人人爽| 多男操一女视频| 亚洲一区二区在线观看视频 | 9191成人精品久久| 人妻无码中文字幕免费视频蜜桃| 亚洲人精选亚洲人成在线| 欧美成人hd| 性色av一区二区三区红粉影视| 欧美日韩亚洲国产| av免费观看久久| 九九视频免费观看视频精品| 蜜桃视频成人在线观看| 欧美综合二区| 激情五月婷婷基地| 91在线视频免费91| 成人免费视频入口| 亚洲.国产.中文慕字在线| 中文在线资源天堂| 精品久久久久久无| 在线视频91p| 91国产中文字幕| 精品国产乱码一区二区三区| 欧美lavv| 国产精品porn| 国产aaaaa毛片| 99精品国产一区二区三区不卡| 在线观看亚洲网站| 日本精品视频一区二区三区| 亚洲精品字幕在线观看| 日韩专区在线观看| 性xxxxfreexxxxx欧美丶| av一区二区三区四区电影| 青青草综合网| 大肉大捧一进一出好爽动态图| 国产高清久久久久| 婷婷丁香综合网| 色天天综合色天天久久| 天堂国产一区二区三区| 久久精视频免费在线久久完整在线看| 依依综合在线| 国产免费一区二区三区| 欧美日韩国产欧| 色婷婷一区二区三区av免费看| 久久久久久免费网| 亚洲国产精品成人无久久精品| 欧美一区二区在线免费播放| 在线观看av的网站| 国产精品国产三级国产aⅴ9色| 香蕉久久精品日日躁夜夜躁| 拔插拔插海外华人免费| 国产99一区视频免费| 国产黄色的视频| 欧美日韩的一区二区| 成人午夜在线观看视频| 欧美自拍视频在线观看| 美国一区二区| 国产美女主播在线播放| 成人午夜av电影| 久久综合色综合| 精品国产乱码久久久久久1区2区| 成人av黄色| 51蜜桃传媒精品一区二区| 午夜国产一区二区| 久久久久久蜜桃一区二区| 中文字幕精品综合| 91丨九色丨海角社区| 亚洲欧洲国产一区| 成人直播视频| 日韩av不卡播放| 日本aⅴ免费视频一区二区三区| 鲁丝一区二区三区| 欧美又粗又大又爽| 超碰免费在线| 国产一区二区丝袜| 99热国内精品| 男人女人拔萝卜视频| 亚洲在线免费播放| 秋霞欧美在线观看| 午夜精品三级视频福利| 久久99蜜桃| 2025韩国理伦片在线观看| 国产精品成人免费在线| 国产精品无码免费播放| 欧美国产日产韩国视频| 精品国产影院| 国产天堂在线播放| 中文字幕视频一区二区三区久| 精品久久久中文字幕人妻| 久久久亚洲成人| 神马日本精品| 日本xxxx黄色| 亚洲精品视频在线观看网站| 国产91麻豆视频| 亲爱的老师9免费观看全集电视剧| 精品久久国产| 青娱乐精品在线| 性久久久久久久久久久久| 久久经典视频| 成人黄色大片在线免费观看| 亚洲国产国产亚洲一二三| 成都免费高清电影| 欧美一区二区三区成人| jizzjizz中国精品麻豆| 日韩av高清在线播放| 国产精品一区二区黑丝| 一级片中文字幕| 久久精品国产96久久久香蕉| 九色丨蝌蚪丨成人| 日韩欧美黄色大片| 一区二区三区日本| 毛片在线播放网站| 91亚洲午夜在线| 亚洲欧美日韩综合国产aⅴ| 欧美a级片免费看| 亚洲国产一区二区三区四区| 国产精品第一国产精品| 日韩网站在线免费观看| 欧美极品少妇xxxxⅹ高跟鞋| 午夜精品久久久久久久91蜜桃| 国产福利精品av综合导导航| 你懂的亚洲视频| 日本美女xxx| 亚洲国产精品va在线看黑人 |