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

欧美激情国产精品日韩| 91免费看网站| 免费看黄色三级| 青青在线精品| 亚洲一区二区在线视频| 国产精品国产亚洲精品看不卡15 | 高清av免费看| 麻豆av在线免费观看| 国产亚洲一本大道中文在线| 成人写真福利网| 国内免费精品视频| 91精品综合| 国产婷婷成人久久av免费高清 | 在线一区二区三区视频| 欧美性猛交xxxx黑人猛交| 欧美性视频在线播放| 性xxxx视频| 国产一区二区在线观看免费| 91精品国产91久久久久| 国产传媒免费在线观看| 亚洲精品国产动漫| 日韩欧美激情一区| 五月婷婷丁香综合网| а√天堂8资源在线| 国产日产亚洲精品系列| 九九九九九精品| 国产丝袜在线视频| 美女国产一区二区| 国产999在线| 日韩人妻无码一区二区三区99| 久久久久久久久久久久久久| 亚洲人成自拍网站| 午夜男人的天堂| 亚洲日本一区二区三区在线| 欧美日韩免费不卡视频一区二区三区 | 欧洲中文字幕精品| 国产黄视频在线| 国产99re66在线视频| 亚洲欧洲制服丝袜| 日本婷婷久久久久久久久一区二区| 欧日韩在线视频| 国产高清在线观看免费不卡| 成人a视频在线观看| 中文字幕 国产| 日韩精品亚洲专区| 国产成人精品视频| 免费av中文字幕| 噜噜噜在线观看免费视频日韩| 欧美极品少妇xxxxⅹ裸体艺术| 欧美国产日韩在线观看成人| 亚洲精品国产偷自在线观看| 精品国产一区二区三区久久| 国产美女免费网站| 精品视频日韩| 最近2019中文字幕mv免费看 | 91成人免费在线观看| 国产精品人妻一区二区三区| 秋霞国产午夜精品免费视频| 国产精品吹潮在线观看| 91麻豆精品在线| 久久精品国产一区二区| 成人av.网址在线网站| 国产精品视频a| 国产乱对白刺激视频不卡| 91免费看片网站| 国产极品久久久| 丁香婷婷综合激情五月色| 国产亚洲情侣一区二区无| 日本精品久久久久久| 91女厕偷拍女厕偷拍高清| 欧美不卡三区| av大片在线观看| 中文字幕亚洲成人| 99热都是精品| 啊啊啊久久久| 日本精品一级二级| 国产成人美女视频| 亚洲五码在线| 亚洲精品视频二区| 大吊一区二区三区| 欧美精品大片| 国产91在线播放| 亚洲视频中文字幕在线观看| 国产一区二区美女诱惑| 国产欧美一区二区三区不卡高清| 午夜小视频在线播放| 国产清纯美女被跳蛋高潮一区二区久久w | 999久久久精品国产| 欧美日本亚洲视频| 一级做a爰片久久毛片| 久久se精品一区二区| 国产传媒一区二区三区| 黄色影院在线播放| 亚洲欧美国产三级| 青青艹视频在线| 福利精品一区| 亚洲国产中文字幕在线观看| 夫妇交换中文字幕| 一区免费视频| 国产精品一区专区欧美日韩| 黄色一级大片在线免费看国产| 国产婷婷色一区二区三区| 国产盗摄视频在线观看| 在线免费三级电影网站| 91精品国产综合久久久久久久久久 | 一区二区导航| 九九视频这里只有精品 | 天使萌一区二区三区免费观看| 成人免费淫片aa视频免费| 日本黄视频在线观看| 中文字幕制服丝袜一区二区三区| 日韩精品 欧美| 电影中文字幕一区二区| 亚洲人成亚洲人成在线观看| 久草视频在线免费看| 奇米一区二区三区av| 国产一区二区三区四区五区加勒比| 1769视频在线播放免费观看| 午夜精品福利一区二区三区蜜桃| 17c国产在线| 欧美人与牛zoz0性行为| 91爱爱小视频k| 精品免费久久久| 国产精品久久久久久久久免费丝袜 | 中文字幕亚洲一区在线观看| 日韩 欧美 中文| 国产很黄免费观看久久| 一本久道久久综合狠狠爱亚洲精品| 黄色在线免费观看网站| 精品欧美久久久| 午夜精品一区二区三级视频| 日韩电影免费在线| 免费毛片一区二区三区久久久| 日韩123区| 欧美一区二区在线免费观看| 亚洲色图日韩精品| 丝瓜av网站精品一区二区| 狠狠色伊人亚洲综合网站色| 伊人影院在线视频| 91精品国产一区二区三区香蕉| 一区二区三区在线播放视频| 日韩1区2区日韩1区2区| 日韩免费电影一区二区| jizz内谢中国亚洲jizz| 日韩精品极品视频| 日本视频免费在线| aaa国产一区| 国产中文字幕免费观看| 老司机在线精品视频| 久久久久免费视频| 日本免费不卡视频| 欧美日韩亚洲天堂| 成年人网站免费看| 久久一区中文字幕| 色噜噜一区二区| 久久精品 人人爱| 日韩在线视频免费观看高清中文| 亚洲天堂网视频| 亚洲精品自拍动漫在线| 在线播放第一页| 亚洲高清av| 青娱乐国产91| av久久网站| 久久中文精品视频| 亚洲精品久久久蜜桃动漫| 亚洲国产视频一区| 醉酒壮男gay强迫野外xx| 老司机久久99久久精品播放免费| 日韩av一区二区三区在线| 日韩国产91| 欧美激情图片区| 色视频免费在线观看| 在线看日本不卡| 欧美一级片在线视频| 国产 欧美在线| 免费无码av片在线观看| 成人羞羞视频播放网站| 亚洲伊人久久综合| 黄色软件视频在线观看| 在线精品国产欧美| 国产高清视频免费| 一本到三区不卡视频| a级黄色免费视频| 岛国av在线一区| 免费男同深夜夜行网站| 亚洲草久电影| 久久大香伊蕉在人线观看热2| 日韩不卡在线| 欧美丰满少妇xxxxx| 激情视频在线观看免费| 日韩三级视频在线看| 国产高清中文字幕| 自拍偷在线精品自拍偷无码专区 | 国产白浆在线观看| 欧美午夜片欧美片在线观看| 国产一二三av| aaa国产一区| 免费成年人高清视频| 99精品国产福利在线观看免费| 亚洲午夜激情| 欧美韩一区二区| 成人夜晚看av| 成人性生交大片免费网站| 欧美成人午夜激情在线| 酒色婷婷桃色成人免费av网| 精品乱人伦一区二区三区| 国产午夜无码视频在线观看| 亚洲一级二级三级在线免费观看| 国产黄色大片免费看| 丁香亚洲综合激情啪啪综合| 中文字幕av专区| 亚洲一区日韩在线| 青青草视频国产| 91日韩视频| 欧美日韩三区四区| 国产福利一区二区精品秒拍| 国产在线拍偷自揄拍精品| 一级毛片久久久| 久久久亚洲影院| 亚洲图区一区| www.日本久久久久com.| av在线天堂播放| 亚洲男子天堂网| 无码国产精品96久久久久| 日韩欧美精品三级| 国产又粗又猛又爽又黄的| 色婷婷激情久久| 日韩欧美亚洲一区二区三区| 樱桃国产成人精品视频| 国精品人伦一区二区三区蜜桃| 久久亚洲捆绑美女| 久久久久久久无码| 成人久久18免费网站麻豆| 手机精品视频在线| 精品一区二区三区日韩| 精品综合久久久久| 久久精品国产秦先生| 欧美三级午夜理伦三级富婆| 久久九九99| 精品久久久久久久免费人妻| 国产欧美短视频| 国产精品自拍片| 国产精品综合| 欧美牲交a欧美牲交aⅴ免费下载| 一本色道久久综合亚洲精品不| 精品国产一区二区三区无码| 国内自拍一区| 波多野结衣av一区二区全免费观看| 亚洲精品tv久久久久久久久久| 永久免费精品视频网站| 99久久婷婷这里只有精品| 久久免费视频2| 你懂的视频一区二区| 国产日产欧美一区二区| 你懂的亚洲视频| 福利视频一二区| 国产亚洲成人一区| 欧美激情精品久久久久久小说| 日韩高清国产一区在线| 亚洲欧美国产日韩综合| 精品亚洲aⅴ乱码一区二区三区| 中文字幕第一页在线视频| 国产乱码精品一区二区三区忘忧草| 欧美一级片在线免费观看| 成人av在线资源网站| av小说在线观看| 中文字幕精品一区二区精品绿巨人 | 99久久久无码国产精品免费| 亚洲成人av资源网| 色在线免费视频| 中日韩美女免费视频网站在线观看 | 亚洲欧美在线另类| 国产一级片视频| 91精品福利视频| 国产精品爽爽久久| 亚洲电影免费观看高清完整版在线观看| 五月婷婷综合久久| 最近2019中文字幕一页二页| 日本一级理论片在线大全| 91po在线观看91精品国产性色| 成人精品国产| 成人91视频| 国产免费久久| 亚洲av综合色区| 亚洲在线一区| 天堂av在线8| av午夜一区麻豆| 三级黄色在线观看| 精品国产乱码久久久久久婷婷| 亚洲精品毛片一区二区三区| 日韩免费观看高清完整版| 欧洲亚洲精品视频| 欧美成人性色生活仑片| 精品国产第一福利网站| 91偷拍精品一区二区三区| 综合伊思人在钱三区| 男人j进女人j| 日韩不卡在线观看日韩不卡视频| 一区二区三区国产好的精华液| 成人av在线影院| 国产麻豆a毛片| 日韩欧美在线网址| 国产福利小视频| 中文字幕在线精品| 国产777精品精品热热热一区二区| 国产精品美乳在线观看| 久9re热视频这里只有精品| 亚洲 欧洲 日韩| 日韩国产精品久久| 国产精品入口麻豆| 1000部国产精品成人观看| 亚洲欧美自拍视频| 欧美大片拔萝卜| 秋霞a级毛片在线看| 国产91在线视频| 美女呻吟一区| 激情五月六月婷婷| 国内精品在线播放| аⅴ天堂中文在线网| 欧美日韩中文字幕在线视频| 亚洲卡一卡二卡三| 久久夜色撩人精品| 久久人体av| 亚洲电影免费| 老司机午夜精品视频| 亚洲av无码一区二区三区网址| 一区二区三区在线视频观看58 | av在线一区不卡| 久久伦理网站| 99精品99| 中文字幕日韩三级片| 亚洲一二三四在线观看| 国产夫妻自拍av| 欧美区在线播放| 欧美国产中文高清| 欧美aaa在线观看| 九九在线精品视频| 三级黄色在线观看| 51精品视频一区二区三区| 最新真实国产在线视频| 国产精品视频网| 郴州新闻综合频道在线直播| 中文字幕国产传媒| 中文天堂在线一区| 在线播放精品视频| 日韩在线观看免费网站| yiren22亚洲综合| 樱花www成人免费视频| 麻豆91精品91久久久的内涵| 男女男精品视频网站| 欧美日韩第一区日日骚| 精品176二区| 99久久一区三区四区免费| 亚洲性感美女99在线| 亚洲美女在线播放| 黄色精品在线看| 国内av一区二区三区| 国产欧美日韩丝袜精品一区| 欧美激情黄色片| 午夜诱惑痒痒网| 亚洲精选一二三| 天堂在线观看免费视频| 欧美亚洲视频在线观看| 国产欧美一区| 亚洲精品久久久久久宅男| 亚洲人成影院在线观看| www.com在线观看| 97超级碰碰碰久久久| 国精一区二区| 久久久久久久久久毛片| 亚洲成av人在线观看| 男人久久精品| 91麻豆国产精品| 亚洲黄色在线| 久久久久亚洲av无码a片| 3d动漫精品啪啪一区二区竹菊| 在线电影福利片| 精品国产一区二区三区麻豆小说| 久久九九99| 麻豆精品一区二区三区视频| 日韩欧美一级二级三级| 黑人巨大精品欧美一区二区桃花岛| 亚洲精品成人久久久998| 国产成人精品三级麻豆| 久久青青草视频| 最近2019年中文视频免费在线观看 | 欧美高清性xxxxhdvideosex| 久久机这里只有精品| 国产精品第一页在线观看| 国产亚洲a∨片在线观看| 精品国产欧美| 国产精品无码专区av在线播放| 亚洲精选在线视频| 国产三级视频在线| 亚洲最大成人网色| 亚洲欧美日韩综合国产aⅴ| 亚洲熟女毛茸茸| 精品小视频在线| 精品视频在线观看网站| 国产精品无码专区av在线播放|