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

前端MVC變形記

開發 前端
MVC是一種架構設計模式,它通過關注點分離鼓勵改進應用程序組織。在過去,MVC被大量用于構建桌面和服務器端應用程序,如今Web應用程序的開發已經越來越向傳統應用軟件開發靠攏,Web和應用之間的界限也進一步模糊。傳統編程語言中的設計模式也在慢慢地融入Web前端開發。

背景:

MVC是一種架構設計模式,它通過關注點分離鼓勵改進應用程序組織。在過去,MVC被大量用于構建桌面和服務器端應用程序,如今Web應用程序的開發已經越來越向傳統應用軟件開發靠攏,Web和應用之間的界限也進一步模糊。傳統編程語言中的設計模式也在慢慢地融入Web前端開發。由于前端開發的環境特性,在經典MVC模式上也引申出了諸多MV*模式,被實現到各個Javascript框架中都有多少的衍變。在研究MV*模式和各框架的過程中,卻是“剪不斷、理還亂”:

  1. 為什么每個地方講的MVC都不太一樣?
  2. MVP、MVVM的出現是要解決什么問題?
  3. 為什么有人義正言辭的說“MVC在Web前端開發中根本無法使用”?

帶著十萬個為什么去翻閱很多資料,但是看起來像view、model、controller、解耦、監聽、通知、主動、被動、注冊、綁定、渲染等各種術語的排列組合,像汪峰的歌詞似的。本篇希望用通俗易懂的方式闡述清楚一些關系,由于接觸時間有限,英文閱讀能力有限,可能會存在誤解,歡迎討論和糾正。

MVC變形記

MVC歷史

MVC最初是在研究Smalltalk-80(1979年)期間設計出來的,恐怕沒有一本書能夠回到計算機石器時代介紹一下Smalltalk的代碼是如何實現MVC的,不僅如此,連想搞清楚當時的應用場景都很難了,都要追溯到80后出生以前的事了。但是當時的圖形界面少之又少,施樂公司正在研發友好的用戶圖形界面,以取代電腦屏幕上那些拒人于千里之外的命令行和DOS提示符。那時計算機世界天地混沌,渾然一體,然后出現了一個創世者,將現實世界抽象出模型形成model,將人機交互從應用邏輯中分離形成view,然后就有了空氣、水、雞啊、蛋什么的。在1995年出版的《設計模式:可復用面向對象軟件的基礎》對MVC進行了深入的闡述,在推廣使用方面發揮了重要作用。

MVC包括三類對象,將他們分離以提高靈活性和復用性。

  • 模型model用于封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法,會有一個或多個視圖監聽此模型。一旦模型的數據發生變化,模型將通知有關的視圖。
  • 視圖view是它在屏幕上的表示,描繪的是model的當前狀態。當模型的數據發生變化,視圖相應地得到刷新自己的機會。
  • 控制器controller定義用戶界面對用戶輸入的響應方式,起到不同層面間的組織作用,用于控制應用程序的流程,它處理用戶的行為和數據model上的改變。 

 

經典MVC模式

實線:方法調用 虛線:事件通知

其中涉及兩種設計模式:

  • view和model之間的觀察者模式,view觀察model,事先在此model上注冊,以便view可以了解在數據model上發生的改變。
  • view和controller之間的策略模式

一個策略是一個表述算法的對象,MVC允許在不改變視圖外觀的情況下改變視圖對用戶輸入的響應方式。例如,你可能希望改變視圖對鍵盤的響應方式,或希望使用彈出菜單而不是原來的命令鍵方式。MVC將響應機制封裝在controller對象中。存在著一個controller的類層次結構,使得可以方便地對原有的controller做適當改變而創建新的controller。

view使用controller子類的實例來實現一個特定的響應策略。要實現不同的響應的策略只要用不同種類的controller實例替換即可。甚至可以在運行時刻通過改變view的controller來改變用戶輸入的響應方式。例如,一個view可以被禁止接受任何輸入,只需給他一個忽略輸入事件的controller。

好吧,如果被上述言論繞昏了,請繼續研讀《設計模式:可復用面向對象軟件的基礎》。

MVC for JAVASCRIPT

我們回顧了經典的MVC,接下來講到的MVC主要是在Javascript上的實現。

 

javascript MVC模式

源圖

如圖所示,view承接了部分controller的功能,負責處理用戶輸入,但是不必了解下一步做什么。它依賴于一個controller為她做決定或處理用戶事件。事實上,前端的view已經具備了獨立處理用戶事件的能力,如果每個事件都要流經controller,勢必增加復雜性。同時,view也可以委托controller處理model的更改。model數據變化后通知view進行更新,顯示給用戶。這個過程是一個圓,一個循環的過程。

這種從經典MVC到Javascript MVC的1對1轉化,導致控制器的角色有點尷尬。MVC這樣的結構的正確性在于,任何界面都需要面對一個用戶,而controller “是用戶和系統之間的鏈接”。在經典MVC中,controller要做的事情多數是派發用戶輸入給不同的view,并且在必要的時候從view中獲取用戶輸入來更改model,而Web以及絕大多數現在的UI系統中,controller的職責已經被系統實現了。由于某種原因,控制器和視圖的分界線越來越模糊,也有認為,view啟動了action理論上應該把view歸屬于controller。比如在Backbone中,Backbone.View和Backbone.Router一起承擔了controller的責任。這就為MVC中controller的衍變埋下了伏筆。

MVP

MVP(model-view-Presenter)是經典MVC設計模式的一種衍生模式,是在1990年代Taligent公司創造的,一個用于C++ CommonPoint的模型。背景上不再考證,直接上圖看一下與MVC的不同。

 

MVP模式

經典MVC中,一對controller-view捆綁起來表示一個ui組件,controller直接接受用戶輸入,并將輸入轉為相應命令來調用model的接口,對model的狀態進行修改,***通過觀察者模式對view進行重新渲染。

進化為MVP的切入點是修改controller-view的捆綁關系,為了解決controller-view的捆綁關系,將進行改造,使view不僅擁有UI組件的結構,還擁有處理用戶事件的能力,這樣就能將controller獨立出來。為了對用戶事件進行統一管理,view只負責將用戶產生的事件傳遞給controller,由controller來統一處理,這樣的好處是多個view可共用同一個controller。此時的controller也由組件級別上升到了應用級別,然而更新view的方式仍然與經典MVC一樣:通過Presenter更新model,通過觀察者模式更新view。

另一個顯而易見的不同在于,MVC是一個圓,一個循環的過程,但MVP不是,依賴Presenter作為核心,負責從model中拿數據,填充到view中。常見的MVP的實現是被動視圖(passive view),Presenter觀察model,不再是view觀察model,一旦model發生變化,就會更新view。Presenter有效地綁定了model到view。view暴露了setters接口以便Presenter可以設置數據。對于這種被動視圖的結構,沒有直接數據綁定的概念。但是他的好處是在view和model直接提供更清晰的分離。但是由于缺乏數據綁定支持,意味著不得不單獨關注某個任務。在MVP里,應用程序的邏輯主要在Presenter來實現,其中的view是很薄的一層。

MVVM

MVVM,Model-View-ViewModel,最初是由微軟在使用Windows Presentation Foundation和SilverLight時定義的,2005年John Grossman在一篇關于Avalon(WPF 的代號)的博客文章中正式宣布了它的存在。如果你用過Visual Studio, 新建一個WPF Application,然后在“設計”中拖進去一個控件、雙擊后在“代碼”中寫事件處理函數、或者綁定數據源。就對這個MVVM有點感覺了。比如VS自動生成的如下代碼:

  1. <GroupBox Header="綁定對象"
  2.     <StackPanel Orientation="Horizontal" Name="stackPanel1"
  3.         <TextBlock Text="學號:"/> 
  4.         <TextBlock Text="{Binding Path=StudentID}"/> 
  5.         <TextBlock Text="姓名:"/> 
  6.         <TextBlock Text="{Binding Path=Name}"/> 
  7.         <TextBlock Text="入學日期:"/> 
  8.         <TextBlock Text="{Binding Path=EntryDate, StringFormat=yyyy-MM-dd}"/> 
  9.         <TextBlock Text="學分:"/> 
  10.         <TextBlock Text="{Binding Path=Credit}"/> 
  11.     </StackPanel> 
  12. </GroupBox>  
  1. stackPanel1.DataContext = new Student() { 
  2.     StudentID=20130501, 
  3.     Name="張三"
  4.     EntryDate=DateTime.Parse("2013-09-01"), 
  5.     Credit=0.0 
  6. }; 

其中最重要的特性之一就是數據綁定,Data-binding。沒有前后端分離,一個開發人員全搞定,一只手抓業務邏輯、一只手抓數據訪問,順帶手拖放幾個UI控件,綁定數據源到某個對象或某張表,一步到位。

背景介紹完畢,再來看一下理論圖

 

MVVM模式

首先,view和model是不知道彼此存在的,同MVP一樣,將view和model清晰地分離開來。 其次,view是對viewmodel的外在顯示,與viewmodel保持同步,viewmodel對象可以看作是view的上下文。view綁定到viewmodel的屬性上,如果viewmodel中的屬性值變化了,這些新值通過數據綁定會自動傳遞給view。反過來viewmodel會暴露model中的數據和特定狀態給view。 所以,view不知道model的存在,viewmodel和model也覺察不到view。事實上,model也完全忽略viewmodel和view的存在。這是一個非常松散耦合的設計。

流行的MV*框架:

每個框架都有自己的特性,這里主要討論MVC三個角色的責任。粗淺地過一遍每個框架的代碼結構和風格。

BackboneJS

Backbone通過提供模型Model、集合Collection、視圖View賦予了Web應用程序分層結構,其中模型包含領域數據和自定義事件;集合Colection是模型的有序或無序集合,帶有豐富的可枚舉API; 視圖可以聲明事件處理函數。最終將模型、集合、視圖與服務端的RESTful JSON接口連接。

Backbone在升級的過程中,去掉了controller,由view和router代替controller,view集中處理了用戶事件(如click,keypress等)、渲染HTML模板、與模型數據的交互。Backbone的model沒有與UI視圖數據綁定,而是需要在view中自行操作DOM來更新或讀取UI數據。Router為客戶端路由提供了許多方法,并能連接到指定的動作(actions)和事件(events)。

Backbone是一個小巧靈活的庫,只是幫你實現一個MVC模式的框架,更多的還需要自己去實現。適合有一定Web基礎,喜歡原生JS去操作DOM(因為沒有數據綁定)的開發人員。為什么稱它為庫,而不是框架,不僅僅是由于僅4KB的代碼,更重要的是 使用一個庫,你有控制權。如果用一個框架,控制權就反轉了,變成框架在控制你。庫能夠給予靈活和自由,但是框架強制使用某種方式,減少重復代碼。這便是Backbone與Angular的區別之一了。

至于Backbone屬于MV*中的哪種模式,有人認為不是MVC,有人覺得更接近于MVP,事實上,它借用多個架構模式中一些很好的概念,創建一個運行良好的靈活框架。不必拘泥于某種模式。

  1. // view
  2. var Appview = Backbone.View.extend({ 
  3.     // 每個view都需要一個指向DOM元素的引用,就像ER中的main屬性。 
  4.     el: '#container'
  5.  
  6.     // view中不包含html標記,有一個鏈接到模板的引用。 
  7.     template: _.template("<h3>Hello <%= who %></h3>"), 
  8.  
  9.     // 初始化方法 
  10.     initialize: function(){ 
  11.       this.render(); 
  12.     }, 
  13.  
  14.     // $el是一個已經緩存的jQuery對象 
  15.     render: function(){ 
  16.       this.$el.html("Hello World"); 
  17.     }, 
  18.  
  19.     // 事件綁定 
  20.     events: {'keypress #new-todo''createTodoOnEnter'
  21. }); 
  22. var appview = new Appview(); 
  23.  
  24. // model: 
  25. // 每個應用程序的核心、包含了交互數據和邏輯 
  26. // 如數據驗證、getter、setter、默認值、數據初始化、數據轉換 
  27. var app = {}; 
  28.  
  29. app.Todo = Backbone.model.extend({ 
  30.   defaults: { 
  31.     title: ''
  32.     completed: false 
  33.   } 
  34. }); 
  35.  
  36. // 創建一個model實例 
  37. var todo = new app.Todo({title: 'Learn Backbone.js', completed: false}); 
  38. todo.get('title'); // "Learn Backbone.js" 
  39. todo.get('completed'); // false 
  40. todo.get('created_at'); // undefined 
  41. todo.set('created_at'Date()); 
  42. todo.get('created_at'); // "Wed Sep 12 2012 12:51:17 GMT-0400 (EDT)" 
  43.  
  44. // collection: 
  45. // model的有序集合,可以設置或獲取model 
  46. // 監聽集合中的數據變化,從后端獲取模型數據、持久化。 
  47. app.TodoList = Backbone.Collection.extend({ 
  48.   model: app.Todo, 
  49.   localStorage: new Store("backbone-todo"
  50. }); 
  51.  
  52. // collection實例 
  53. var todoList = new app.TodoList() 
  54. todoList.create({title: 'Learn Backbone\'s Collection'}); 
  55.  
  56. // model實例 
  57. var model = new app.Todo({title: 'Learn models', completed: true}); 
  58. todoList.add(model); 
  59. todoList.pluck('title'); 
  60. todoList.pluck('completed'); 

KnockoutJS

KnockoutJS是一個名正言順的MVVM框架,通過簡潔易讀的data-bind語法,將DOM元素與viewmodel關聯起來。當模型(viewmodel)狀態更新時,自動更新UI界面。 viewmodel是model和view上的操作的一個連接,是一個純粹的Javascript對象。它不是UI,沒有控件和樣式的概念,它也不是持久化的模型數據,它只是hold住一些用戶正在編輯的數據,然后暴露出操作這些數據(增加或刪除)的方法。

view是對viewmodel中數據的一個可視化的顯示,view觀察viewmodel,操作view時會發送命令到viewmodel,并且當viewmodel變化時更新。view和model是不了解彼此的存在的。

  1. <form data-bind="submit: addItem"
  2.     New item: 
  3.     <input data-bind='value: itemToAdd, valueUpdate: "afterkeydown"' /> 
  4.     <button type="submit" data-bind="enable: itemToAdd().length > 0">Add</button> 
  5.     <p>Your items:</p> 
  6.     <select multiple="multiple" width="50" data-bind="options: items"> </select
  7. </form> 
  1. // viewmodel 
  2. var SimpleListmodel = function(items) { 
  3.     this.items = ko.observableArray(items); 
  4.     this.itemToAdd = ko.observable(""); 
  5.     this.addItem = function() { 
  6.         if (this.itemToAdd() != "") { 
  7.             // 把input中的值加入到items,會自動更新select控件 
  8.             this.items.push(this.itemToAdd()); 
  9.             // 清空input中的值 
  10.             this.itemToAdd(""); 
  11.         } 
  12.     // 確保這里的this一直是viewmodel 
  13.     }.bind(this); 
  14. }; 
  15.  
  16. ko.applyBindings(new SimpleListmodel(["Alpha""Beta""Gamma"])); 

AngularJS

AngularJS試圖成為Web應用中的一種端對端的解決方案。這意味著它不只是你的Web應用中的一個小部分,而是一個完整的端對端的解決方案。這會讓AngularJS在構建一個CRUD的應用時看起來很呆板,缺乏靈活性。AngularJS是為了克服HTML在構建應用上的不足而設計的。使用了不同的方法,它嘗試去補足HTML本身在構建應用方面的缺陷。通過使用標識符(directives)的結構,讓瀏覽器能夠識別新的語法。例如使用雙大括號語法進行數據綁定;使用ng-controller指定每個控制器負責監視視圖中的哪一部分;使用ng-model,把輸入數據綁定到模型中的一部分屬性上。

雙向數據綁定是AngularJS的另一個特性。UI控件的任何更改會立即反映到模型變量(一個方向),模型變量的任何更改都會立即反映到問候語文本中(另一方向)。AngularJS通過作用域來保持數據模型與視圖界面UI的雙向同步。一旦模型狀態發生改變,AngularJS會立即刷新反映在視圖界面中,反之亦然。

AngularJS原本是傾向于MVC,但是隨著項目重構和版本升級,現在更接近MVVM。和Knockout view中的風格類似,都像從WPF衍變過來的,只是Knockout使用了自定義屬性data-bind作為綁定入口,而AngularJS對于HTML的變革更徹底,擴展HTML的語法,引入一系列的指令。

在AngularJS中,一個視圖是模型通過HTML模板渲染之后的映射。這意味著,不論模型什么時候發生變化,AngularJS會實時更新結合點,隨之更新視圖。比如,視圖組件被AngularJS用下面這個模板構建出來:

  1. <body ng-controller="PhoneListCtrl"
  2.     <ul> 
  3.         <li ng-repeat="phone in phones"
  4.             {{phone.name}} 
  5.             <p>{{phone.snippet}}</p> 
  6.         </li> 
  7.     </ul> 
  8. </body> 

在li標簽里面的ng-repeat語句是一個AngularJS迭代器。包裹在phone.name和phone.snippet周圍的花括號標識著數據綁定,是對應用一個數據模型的引用。當頁面加載的時候,AngularJS會根據模版中的屬性值,將其與數據模型中相同名字的變量綁定在一起,以確保兩者的同步性。

在PhoneListCtrl控制器里面初始化了數據模型:

  1. // controller: 
  2. function PhoneListCtrl($scope) { 
  3.   // 數組中存儲的對象是手機數據列表 
  4.   $scope.phones = [ 
  5.     {"name""Nexus S"
  6.      "snippet""Fast just got faster with Nexus S."}, 
  7.     {"name""Motorola XOOM™ with Wi-Fi"
  8.      "snippet""The Next, Next Generation tablet."}, 
  9.     {"name""MOTOROLA XOOM™"
  10.      "snippet""The Next, Next Generation tablet."
  11.   ]; 

盡管控制器看起來并沒有什么控制的作用,但是它在這里的重要性在于,通過給定數據模型的作用域$scope,允許建立模型和視圖之間的數據綁定。方法名PhoneListCtrl和body標簽里面的ngcontroller指令的值相匹配。當應用啟動之后,會有一個根作用域被創建出來,而控制器的作用域是根作用域的一個典型后繼。這個控制器的作用域對所有

標記內部的數據綁定有效。

AngularJS的作用域理論非常重要:一個作用域可以視作模板、模型和控制器協同工作的粘接器。AngularJS使用作用域,同時還有模板中的信息,數據模型和控制器。這些可以幫助模型和視圖分離,但是他們兩者確實是同步的!任何對于模型的更改都會即時反映在視圖上;任何在視圖上的更改都會被立刻體現在模型中。

實踐中的思考

我們使用的MVC框架是ER,適用于并能很方便地構建一個整站式的AJAX Web應用。提供精簡、核心的action、model和view的抽象,使得構建RIA應用變得簡單可行。在使用的過程中近距離地體會到非常多方面的優秀的設計理念。也讓我開始思考各個角色的轉型。

讓view上前線

我開始思考action(controller)這個角色。我覺得從純粹地解耦角度來說,view和model應該是互相不知道彼此存在的,所有的事件流和對數據、UI的處理應該都流經action。但是這一點又極不現實。用戶操作了一個UI,需要更新model的一個數據,就要fire到action,通過action來調用model的set方法。這樣又有點麻煩,因為view中有對model的應用,可以一句代碼搞定這一個數據的設置。所以,我自己設置了一個規則:如果是簡單的模型數據讀寫可以直接在view中操作;如果要經過復雜的數據處理,必須流經action。于是,我遇到了一種怎么都偷不了懶(必須經過action)的情況: 比如有個主action main,兩個子action list、select,用戶在list中的view選擇一條數據添加到右側select中。那走過的流程是這樣的:

 

實踐中的思考

  1. 子Action中的listView接受UI事件,fire到listAction中
  2. listAction繼續將事件fire到mainView中,由主action來處理另外子Action的事情。
  3. mainView接收到事件、調用子Action selectAction的方法
  4. selectAction繼續調用selectView的方法來完成UI的更新。

其中涉及的model的變化暫時不考慮。我在想,view既然把經典MVC中的controller接受用戶事件的角色承接過來的,那如果借鑒Backbone的思想,把view作為controller的一個實現,推到戰場的最前線。省掉兩次action的中轉傳遞,是不是更簡單。

model驅動開發

實際開發中,常常會以view為核心,頁面上需要展示什么數據,就去model中設置數據源。發生了用戶事件,我會在action中更新model,然后刷新view。有時候會遺漏更新model,直到需要數據時才發現沒有保存到model中。

model本身是獨立的,自控制的,不依賴于view,能夠同步支持多view的顯示。就像linux上的應用程序通常會提供圖形界面和命令行兩種操作方式一樣。那如果以model為核心,model驅動開發,數據在手、天下我有,以模型驗證保證數據的完整性和正確性。實現數據綁定,任何對模型的更改都會在界面上反映出來。那我們只要預先寫好view和model的關系映射(類似viewmodel),然后只關注模型數據,就OK了。 

責任編輯:龐桂玉 來源: 程序源
相關推薦

2015-11-27 18:32:02

Dex優化分包方案

2022-10-27 09:04:07

wepyuniapp開發

2023-10-27 08:34:46

PythonJava優勢

2012-10-16 16:32:14

2023-04-20 07:18:56

CTO驅動力

2017-11-29 09:34:03

MVP蘇寧移動

2025-10-30 02:45:00

數據架構ODS

2019-05-13 16:08:30

蘋果iMessage垃圾短信

2015-10-13 10:54:15

中關村創業電子賣場

2013-12-17 17:23:06

2015-09-10 13:35:45

云海大數據一體機

2025-03-20 08:34:46

2011-08-09 15:20:38

2013-01-17 10:31:13

JavaScriptWeb開發firebug

2013-06-03 15:15:51

2021-04-12 09:47:08

機器人人工智能編程

2011-07-22 09:03:20

FTTHPONEPON

2017-07-21 13:33:18

互聯網銀行金融

2015-09-15 09:20:16

圖片變形抗鋸齒
點贊
收藏

51CTO技術棧公眾號

色8久久久久| 国内老熟妇对白xxxxhd| 国际精品欧美精品| 91精品婷婷国产综合久久竹菊| 免费在线观看污污视频| 国产美女三级无套内谢| 禁久久精品乱码| 亚洲图片欧美日产| 欧美日韩理论片| 美女的胸无遮挡在线观看| 国产日韩av一区| 97超碰人人看人人| 亚洲大尺度在线观看| 欧美激情视频一区二区三区在线播放 | 成人免费视频网站入口::| 六月丁香久久丫| 欧美猛男gaygay网站| jizzjizzxxxx| 美女国产在线| 久久免费精品国产久精品久久久久| 国产日韩在线看| 九九热国产在线| 亚洲区小说区| 日韩精品资源二区在线| 蜜臀av免费观看| 五月天av在线| 亚洲综合一区二区精品导航| 亚洲精品日韩成人| 天堂av电影在线观看| 国产成人免费在线观看| 国产欧美久久久久久| 九九精品免费视频| 极品尤物久久久av免费看| 久久不射电影网| 国产在视频线精品视频| 欧美女王vk| 日韩精品一二三四区| 特级特黄刘亦菲aaa级| 黄色成人在线观看网站| 在线视频综合导航| 成年网站在线免费观看| rebdb初裸写真在线观看| 中文字幕一区日韩精品欧美| 国产精品免费在线| 国产精品久久久久久久久久久久久久久久久久 | 99热这里只有精品99| 美女视频一区二区| 国产精品啪视频| 中文字幕一区二区三区免费看| 精品9999| 综合欧美国产视频二区| 免费一级做a爰片久久毛片潮| 亚洲精品推荐| 亚洲天堂成人在线视频| 亚洲精品午夜视频| 中文字幕亚洲影视| 亚洲性视频网站| 美女被到爽高潮视频| 欧美精品一区二区三区中文字幕| 亚洲美女动态图120秒| 最新中文字幕视频| 精品成人影院| 尤物九九久久国产精品的特点| 精品国产aaa| 99久久婷婷| 欧美人成在线视频| 亚洲精品在线观看av| 99日韩精品| 国产福利成人在线| 在线免费观看av片| 国产精品亚洲午夜一区二区三区| 5566av亚洲| 日韩一级片免费在线观看| 99精品视频在线播放观看| 免费日韩电影在线观看| 福利小视频在线观看| 亚洲欧洲成人精品av97| 久久久久久久久久久综合| 国内激情视频在线观看| 在线视频中文字幕一区二区| 搡的我好爽在线观看免费视频| 亚洲一区二区三区日本久久九| 亚洲精品福利免费在线观看| 久久亚洲AV无码专区成人国产| 三区四区不卡| 久久久久久久一| aaaaaa毛片| 国产又黄又大久久| 好吊色欧美一区二区三区| 国产女主播在线写真| 亚洲精品va在线观看| 国产极品粉嫩福利姬萌白酱| 另类一区二区三区| 亚洲成人精品视频| 一级片久久久久| 亚洲精品字幕| 国产精品三级久久久久久电影| 国产成人精品毛片| 久久久不卡影院| 一本二本三本亚洲码| 草草在线观看| 欧美男女性生活在线直播观看| 日本美女视频网站| 欧美hd在线| 91av视频在线| 国内精品久久久久久久久久久| 久久精品一区蜜桃臀影院| 无码毛片aaa在线| sis001欧美| 日韩午夜av一区| 欧美18—19性高清hd4k| 国产精品v日韩精品v欧美精品网站| 国产激情久久久| 蜜桃av噜噜一区二区三区麻豆| 国产日韩欧美综合在线| 成人性生活视频免费看| 日韩午夜视频在线| 亚洲人成毛片在线播放| 日本特黄一级片| 狠狠色丁香九九婷婷综合五月 | 欧美偷拍自拍| 91成人性视频| 亚洲毛片欧洲毛片国产一品色| 中文字幕不卡在线| 超碰网在线观看| 国产毛片久久久| 欧美俄罗斯性视频| 国产又黄又粗又硬| 国产区在线观看成人精品 | 日韩黄色免费观看| 蜜桃传媒麻豆第一区在线观看| 国内精品久久国产| 污污网站在线看| 在线播放91灌醉迷j高跟美女| 久久午夜福利电影| 久久国产精品99国产| 国产精品乱子乱xxxx| a级片国产精品自在拍在线播放| 在线亚洲高清视频| 免费观看a级片| 久久蜜桃精品| 欧美精品一区二区三区在线看午夜 | 亚洲第一二三区| 性欧美暴力猛交69hd| 亚洲男女视频在线观看| 夜夜嗨av一区二区三区| 亚洲精品一二三四| 欧美女激情福利| 成人免费看片网址| 国产精品186在线观看在线播放| 91精品国产综合久久精品app | 亚洲熟妇一区二区| 一区二区三区网站| 91久久精品www人人做人人爽| 动漫一区在线| 欧美变态tickle挠乳网站| 久久伊人成人网| 成人激情黄色小说| 免费国产黄色网址| 在线日本制服中文欧美| 国产成人一区二区三区电影| 成人p站proumb入口| 欧美无砖专区一中文字| 69xxx免费| 久久99国产乱子伦精品免费| 天天做天天爱天天高潮| 日韩欧美高清一区二区三区| 色综合色综合久久综合频道88| 黄色美女一级片| 欧美性高潮在线| 亚洲天堂最新地址| 国产在线播精品第三| 国产精品一线二线三线| 欧美日韩看看2015永久免费| 日本精品久久中文字幕佐佐木| av中文字幕在线| 欧美一二三四区在线| 日韩黄色a级片| 中文字幕 久热精品 视频在线| 欧美女同在线观看| 欧美另类综合| 手机成人在线| 精品成人18| 97超视频免费观看| av免费在线一区二区三区| 3d动漫精品啪啪一区二区竹菊| 久久午夜无码鲁丝片午夜精品| 久久久亚洲综合| 天堂av手机在线| 夜夜嗨网站十八久久| 亚洲欧洲国产精品久久| 哺乳挤奶一区二区三区免费看| 欧美最猛黑人xxxx黑人猛叫黄 | 国外成人免费在线播放 | 色诱女教师一区二区三区| 国产日产亚洲系列最新| 色综合久久久久久久久久久| chinese全程对白| 9l国产精品久久久久麻豆| 欧美婷婷精品激情| 激情亚洲成人| 亚洲欧洲精品一区| 欧美黄色影院| 亚洲www在线观看| 午夜欧美巨大性欧美巨大| 久久影院资源网| 国产无套粉嫩白浆在线2022年| 日韩一区二区三区免费观看| www.久久精品视频| 亚洲自拍偷拍av| 极品美妇后花庭翘臀娇吟小说| 91丨porny丨国产| 日本中文字幕精品| 久久av中文字幕片| 男女av免费观看| 在线观看一区| 成人在线观看www| 精品一区二区三区在线| 久久大片网站| 99久久免费精品国产72精品九九| 国产日韩av在线| 欧美特大特白屁股xxxx| 午夜免费日韩视频| 黄色污污视频在线观看| 久久香蕉国产线看观看av| wwwxxx在线观看| 亚洲视频在线免费观看| 香蕉国产在线视频| 精品国产乱码91久久久久久网站| 国产精品午夜福利| 欧美日韩一级视频| 成年人视频免费| 一本大道久久精品懂色aⅴ| 国产在线观看成人| 亚洲综合999| 国产一级在线免费观看| 亚洲影视在线播放| 欧美人与禽zozzo禽性配| 亚洲精品午夜久久久| 国产成人综合在线视频| 亚洲欧洲美洲综合色网| 97精品在线播放| 日韩美女久久久| 神马久久精品综合| 中文字幕亚洲区| 青青青视频在线免费观看| 国产精品人成在线观看免费 | 不卡的一区二区| 国产成人精品免费网站| 欧美性猛交乱大交| 国产精品一区二区果冻传媒| 亚洲AV无码久久精品国产一区| 国产精品99久久久久久久vr| 无人码人妻一区二区三区免费| 国产精品77777竹菊影视小说| 好吊操视频这里只有精品| 成人性视频免费网站| 国产黑丝一区二区| 久久女同精品一区二区| 久久视频精品在线观看| 国产精品久久久久久久蜜臀 | 午夜亚洲福利| av女优在线播放| 久久久人人人| 中文字幕国产免费| 国产一区二区不卡在线 | 国产精品国产| 蜜桃视频日韩| 久久密一区二区三区| 一区二区三区四区免费观看| 狠狠干综合网| 不卡影院一区二区| 久久福利视频一区二区| 日韩久久久久久久久久久| 成人黄色国产精品网站大全在线免费观看| 日韩无码精品一区二区| 国产午夜精品久久久久久免费视 | 小小影院久久| 日本xxxxxxxxxx75| 日韩黄色免费电影| 九九九久久久久久久| av激情综合网| 中文字幕在线观看二区| 亚洲一区二区偷拍精品| 精品人妻一区二区三区潮喷在线 | 无码国产69精品久久久久网站| 91在线视频18| 国产精品精品软件男同| 精品国产精品自拍| 中文字幕在线播放av| 精品久久久久av影院 | 精品中文字幕在线| 中文字幕在线免费观看视频| 成人免费在线视频网址| 日韩精品社区| 肉大捧一出免费观看网站在线播放| 夜夜夜久久久| 91pony九色| 久久久欧美精品sm网站| 久久久久久福利| 欧美日韩一区二区在线观看| 色综合免费视频| 久久影视电视剧免费网站| 成人美女视频| www.成人三级视频| 成人在线电影在线观看视频| 五月丁香综合缴情六月小说| 极品少妇一区二区三区精品视频 | 亚洲在线视频免费观看| 丰满人妻一区二区三区四区| 精品国产乱码久久久久久闺蜜 | 久久综合色占| 日本中文字幕在线视频观看 | 成人亚洲激情网| 激情婷婷综合| 91好吊色国产欧美日韩在线| 国产剧情一区二区| 特黄一区二区三区| 日韩欧美主播在线| 日韩一区免费视频| 欧美猛男性生活免费| 日韩三区四区| 亚洲第一导航| 日韩精品一二三四| 欧美熟妇精品黑人巨大一二三区| 亚洲午夜久久久久中文字幕久| 91精品国产乱码久久久| 国产一区二区三区丝袜| 玛雅亚洲电影| 另类小说综合网| 日韩视频中文| 国产伦精品一区二区三区精品| 亚洲男同性恋视频| 国产一区二区自拍视频| 日韩中文字幕免费| 国产精品蜜月aⅴ在线| 天天综合狠狠精品| 日本不卡在线视频| 国产免费无遮挡吸奶头视频| 在线影院国内精品| 国产黄色片在线播放| 国产精品99免视看9| 国语产色综合| 男操女免费网站| 国产精品三级电影| 91美女精品网站| 日韩视频精品在线| 91成人精品观看| 国产日韩第一页| 国产精品一区二区在线播放| 好吊色视频在线观看| 欧美大肚乱孕交hd孕妇| 黑人另类精品××××性爽| 国产欧美一区二区视频| 国产精品日本欧美一区二区三区| 国产精品无码网站| 色香色香欲天天天影视综合网| 国产中文在线观看| 国产精品国语对白| 999国产精品999久久久久久| 天天av天天操| 亚洲成人激情综合网| 日本天堂在线| 国产精品久久久久免费a∨| 99久精品视频在线观看视频| www.久久com| 亚洲成a人片在线观看中文| 色综合久久网女同蕾丝边| 国产精品美乳一区二区免费| 一区二区三区毛片免费| 日本五十肥熟交尾| 欧洲精品视频在线观看| 黄色av电影在线观看| 国产无套精品一区二区| 老牛国产精品一区的观看方式| 999久久久国产| 精品电影一区二区三区| 久久爱91午夜羞羞| 午夜在线视频免费观看| 99久久久免费精品国产一区二区| 日韩欧美在线观看免费| 久久婷婷国产麻豆91天堂| 欧美日韩一区二区三区四区不卡| 麻豆传传媒久久久爱| 亚洲人成影院在线观看| 色香蕉在线视频| 国产精品一香蕉国产线看观看| 欧美精品99| 精品熟妇无码av免费久久| 日韩精品一区二区三区蜜臀| 在线一区av| 伊人久久大香线蕉综合75| 成人av免费在线观看| 在线观看毛片av| 97激碰免费视频| 久久精品久久久| 深爱五月激情网| 日韩欧美高清dvd碟片| 日本精品网站| 成人在线观看你懂的|