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

5分鐘即可掌握的前端高效利器:JavaScript策略模式

開發(fā) 前端
策略模式是一種簡單卻常用的設計模式,它的應用場景非常廣泛。我們先了解下策略模式的概念,再通過代碼示例來更清晰的認識它。

 [[341697]]

淺談 JavaScript 中策略模式的使用:

  •  什么是設計模式
  •  什么是策略模式
  •  策略模式在 JavaScript 中的應用(使用策略模式封裝百度AI識別調用)
  •  策略模式在 Vue 組件封裝中的應用(使用策略模式封裝Select組件)

什么是設計模式

設想有一個電子愛好者,雖然他沒有經過正規(guī)的培訓,但是卻日積月累地設計并制造出了許多有用的電子設備:業(yè)余無線電、蓋革計數(shù)器、報警器等。有一天這個愛好者決定重新回到學校去攻讀電子學學位,來讓自己的才能得到正式的認可。隨著課程的展開,這個愛好者突然發(fā)現(xiàn)課程內容都似曾相識。似曾相識的不是術語或表述的方式,而是背后的概念。這個愛好者不斷學到一些名稱和原理,雖然這些名稱和原理原來他并不知道,但事實上他多年以來一直都在使用。整個過程只不過是一個接一個的頓悟。

設計模式沉思錄 ,John Vlissides, 第一章 1.2節(jié)

我們在寫代碼的時候,一定也遇到過許多類似的場景。隨著經驗的增加,我們對于這些常見場景的處理越來越得心應手,甚至總結出了針對性的“套路”,下次遇到此類問題直接運用“套路”解決,省心又省力。這些在軟件開發(fā)過程中逐漸積累下來的“套路”就是設計模式。

設計模式的目標之一就是提高代碼的可復用性、可擴展性和可維護性。正因如此,雖然有時候我們不知道某個設計模式,但是看了相關書籍或文章后會有一種“啊,原來這就是設計模式”的恍然大明白。

如果你看完這篇文章后也有此感覺,那么恭喜你,你已經在高效程序員的道路上一路狂奔了。

什么是策略模式

策略模式是一種簡單卻常用的設計模式,它的應用場景非常廣泛。我們先了解下策略模式的概念,再通過代碼示例來更清晰的認識它。

策略模式由兩部分構成:一部分是封裝不同策略的策略組,另一部分是 Context。通過組合和委托來讓 Context 擁有執(zhí)行策略的能力,從而實現(xiàn)可復用、可擴展和可維護,并且避免大量復制粘貼的工作。

策略模式的典型應用場景是表單校驗中,對于校驗規(guī)則的封裝。接下來我們就通過一個簡單的例子具體了解一下:

粗糙的表單校驗

一個常見的登錄表單代碼如下: 

  1. <form id='login-form' action="" method="post">  
  2.     <label for="account">手機號</label>  
  3.     <input type="number" id="account" name="account">  
  4.     <label for="password">密碼</label>  
  5.     <input type="password" id="password" name="password">  
  6.     <button id='login'>登錄</button>  
  7. </form>  
  8. <script> 
  9.      var loginForm = document.getElementById('login-form'); 
  10.     loginForm.onsubmit = function (e) { 
  11.         e.preventDefault();    
  12.         var account = document.getElementById("account").value;  
  13.         var pwd = document.getElementById("password").value;  
  14.         if(account===null||account===''){  
  15.             alert('手機號不能為空');  
  16.             return false;  
  17.         }  
  18.         if(pwd===null||pwd===''){  
  19.             alert('密碼不能為空');  
  20.             return false;  
  21.         }  
  22.         if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(account)) {  
  23.             alert('手機號格式錯誤');  
  24.             return false;  
  25.         }  
  26.         if(pwd.length<6){  
  27.             alert('密碼不能小于六位');  
  28.             return false;  
  29.         }  
  30.         // ajax 發(fā)送請求  
  31.     }  
  32. </script> 

以上代碼,雖然功能沒問題,但是缺點也很明顯:

代碼里遍地都是 if 語句,并且它們缺乏彈性:每新增一種、或者修改原有校驗規(guī)則,我們都必須去改loginForm.onsubmit內部的代碼。另外邏輯的復用性也很差:如果有其它表單也是用同樣的規(guī)則,這段代碼并不能復用,只能復制。當校驗規(guī)則發(fā)生變化時,比如上文的正則校驗并不能匹配虛擬運營商14/17號段,我們就需要手動同步多處代碼變更(Ctrl+C/Ctrl+V)。

優(yōu)秀的表單驗證

接下來我們通過策略模式的思路改寫一下上段代碼,首先抽離并封裝校驗邏輯為策略組: 

  1. var strategies = {  
  2.     isNonEmpty: function (value, errorMsg) {  
  3.         if (value === '' || value === null) {  
  4.             return errorMsg;  
  5.         }  
  6.     },  
  7.     isMobile: function (value, errorMsg) { // 手機號碼格式  
  8.         if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(value)) {  
  9.             return errorMsg;  
  10.         }  
  11.     },  
  12.     minLength: function (value, length, errorMsg) {  
  13.         if (value.length < length) {  
  14.             return errorMsg;  
  15.         }  
  16.     }  
  17. }; 

接下來修改 Context: 

  1. var loginForm = document.getElementById('login-form');  
  2. loginForm.onsubmit = function (e) {  
  3.     e.preventDefault();   
  4.     var accountIsMobile = strategies.isMobile(account,'手機號格式錯誤');  
  5.     var pwdMinLength = strategies.minLength(pwd,8,'密碼不能小于8位');  
  6.     var errorMsg = accountIsMobile||pwdMinLength;   
  7.     if(errorMsg){  
  8.         alert(errorMsg); 
  9.          return false;  
  10.     } 

對比兩種實現(xiàn),我們可以看到:分離了校驗邏輯的代碼如果需要擴展校驗類型,在策略組中新增定義即可使用;如果需要修改某個校驗的實現(xiàn),直接修改相應策略即可全局生效。對于開發(fā)和維護都有明顯的效率提升。

擴展:史詩的表單校驗

有興趣的朋友可以了解下 async-validator ,element-ui 和 antd 的表單校驗都是基于 async-validator 封裝的,可以說是史詩級別的表單校驗了

通過表單校驗的對比,相信大家都對策略模式有所了解,那么接下來通過兩個例子具體了解下 JavaScript 中策略模式的應用:

使用策略模式調用百度AI圖像識別

因為百度AI圖像識別的接口類型不同,所需的參數(shù)格式也不盡相同。然而圖像的壓縮及上傳、錯誤處理等部分是公用的。所以可以采用策略模式封裝:

定義策略組

通過定義策略組來封裝不同的接口及其參數(shù):比如身份證識別接口的side字段,自定義識別的templateSign字段,以及行駛證識別的接收參數(shù)為poparamstData。 

  1. /**  
  2.  * 策略組  
  3.  * IDCARD:身份證識別  
  4.  * CUSTOMIZED:自定義識別  
  5.  * VL:行駛證識別  
  6.  */  
  7. var strategies = {  
  8.     IDCARD: function (base64) {  
  9.         return {  
  10.             path: 'idcard',  
  11.             param: {  
  12.                 'side': 'front',  
  13.                 'base64': base64  
  14.             }  
  15.         };  
  16.     },  
  17.     CUSTOMIZED: function (base64) {  
  18.         return {  
  19.             path: 'customized',  
  20.             param: {  
  21.                 'templateSign': '52cc2d402155xxxx',  
  22.                 'base64': base64  
  23.             }  
  24.         };  
  25.     },  
  26.     VL: function (base64) {  
  27.         return {  
  28.             path: 'vehicled',  
  29.             poparamstData: {  
  30.                 'base64': base64  
  31.             }  
  32.         };  
  33.     },  
  34. }; 

定義 Context 

  1. var ImageReader = function () { };  
  2. /**  
  3.  * 讀取圖像,調用接口,獲取識別結果  
  4.  *   
  5.  * @param {*} type 待識別文件類型  
  6.  * @param {*} base64 待識別文件 BASE64碼  
  7.  * @param {*} callBack 識別結果回調  
  8.  */  
  9. ImageReader.prototype.getOcrResult = function (type, base64, callBack) {  
  10.     let fileSize = (base64.length / (1024 * 1024)).toFixed(2);  
  11.     let compressedBase64 = '' 
  12.     let image = new Image();  
  13.     image.src = base64 
  14.     image.onload = function () {  
  15.         /**  
  16.          * 圖片壓縮處理及異常處理,代碼略  
  17.          */     
  18.         let postData = strategies[type](compressedBase64); 
  19.         ajax( 
  20.             host + postData.path, {  
  21.                 data: postData.param,  
  22.                 type: 'POST',  
  23.                 headers: {  
  24.                     'Content-Type': 'application/x-www-form-urlencoded'  
  25.                 },  
  26.                 success: function (res) {  
  27.                     var data = JSON.parse(res);  
  28.                     // 暴露給 UI 層的統(tǒng)一的錯誤碼  
  29.                     if (data.error_code !== undefined && data.error_code !== 0) {  
  30.                         var errorData = {  
  31.                             error: 1,  
  32.                             title: '錯誤 ' + data.error_code,  
  33.                             content: 'error message'  
  34.                         };  
  35.                         callBack(errorData);  
  36.                     } else {  
  37.                         callBack(data);  
  38.                     }  
  39.                 }  
  40.             });  
  41.     };  
  42. }; 

調用方式 

  1. var imageReader = new ImageReader();  
  2. imageReader.getOcrResult('IDCARD', this.result.toString(), callback); 

使用策略模式封裝 Vue Select 組件

某項目中多處用到了 element-ui 的 select 組件,其內在邏輯類似,都是初始化時獲取下拉列表的數(shù)據(jù)源,然后在選中某一項時 dispatch 不同的 action。遂考慮使用策略模式封裝。

Context

在本例中,組件向外部暴露一個 prop,調用方指定該 prop 從而加載不同的策略。那么定義 Context 如下: 

  1. <template>  
  2.   <el-select v-model="selectedValue" placeholder="請選擇" @change="optionChanged" size="mini" clearable>  
  3.     <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id">  
  4.     </el-option>  
  5.   </el-select>  
  6. </template>  
  1. data() {  
  2.     return {  
  3.       selectedValue: undefined,  
  4.       options: [],  
  5.       action: "",  
  6.     };  
  7.   },  
  8.   props: {  
  9.     // 暴露給外部的 select-type  
  10.     selectType: {  
  11.       type: String  
  12.     },  
  13.   },  
  14.   created() {  
  15.    // 獲取 options  
  16.    this.valuation();  
  17.   },  
  18.     methods: {  
  19.     optionChanged() {  
  20.       this.$emit(this.action, this.selectedValue);  
  21.     },  
  22.     setOptions(option) {  
  23.       this.$store.dispatch(this.action, option);  
  24.     },  
  25.     valuation() {  
  26.       // 獲取 options 數(shù)據(jù)  
  27.     }  
  28.   }, 

外部通過如下方式調用組件:

  1. <MySelect selectType="product"/> 

strategies

然后定義策略組: 

  1. let strategies = {  
  2.     source: {  
  3.         action: "sourceOption",  
  4.         getOptions:  function() {  
  5.             // 拉取 options  
  6.         }  
  7.     },  
  8.     product: {  
  9.         action: "productOption",  
  10.         getOptions:  function() {  
  11.             // 拉取 options  
  12.         }  
  13.     },  
  14.     ...  

異步

至此該組件的基本結構已經清晰,但還存在一個問題:組件加載時是異步拉取的 options, 而頁面初始化的時候很可能 options 還沒有返回,導致 select 的 options 仍為空。所以此處應該修改代碼,同步獲取 options: 

  1. // 策略組修改  
  2. source: {  
  3.     action: "sourceOption",  
  4.     getOptions: async function() {  
  5.         // await 拉取 options  
  6.     }  
  7.   },  
  8. // 組件修改  
  9. methods: {  
  10.     ...  
  11.     async valuation() {  
  12.         ...  
  13.     }  

繼續(xù)優(yōu)化

但我們不是每次加載組件都需要拉取 options,如果這些 options 在其他組件或者頁面也被使用到,那么可以考慮將其存入 vuex 中。

最開始的思路是高階組件,即定義一個包裝后的select模板,通過高階組件的方式擴展其數(shù)據(jù)源與action(變化的部分)然而這個思路不是那么的vue(主要是slots不太好處理) 于是考慮策略模式改寫該組件

總結

通過以上兩個例子,我們可以看到:

  •  策略模式符合開放-封閉原則
  •  如果代碼里需要寫大量的if-else語句,那么考慮使用策略模式
  •  如果多個組件(類)之間的區(qū)別僅在于它們的行為,考慮采用策略模式 

 

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

2020-05-15 07:30:08

黑客Thunderbolt漏洞

2021-06-07 09:51:22

原型模式序列化

2020-12-07 11:23:32

Scrapy爬蟲Python

2021-03-23 15:35:36

Adam優(yōu)化語言

2020-12-17 10:00:16

Python協(xié)程線程

2021-03-12 09:45:00

Python關聯(lián)規(guī)則算法

2021-01-29 11:25:57

Python爬山算法函數(shù)優(yōu)化

2019-07-24 15:29:55

JavaScript開發(fā) 技巧

2017-01-10 09:07:53

tcpdumpGET請求

2019-12-23 16:42:44

JavaScript前端開發(fā)

2020-10-27 10:43:24

Redis字符串數(shù)據(jù)庫

2020-11-24 11:50:52

Python文件代碼

2018-01-30 05:04:06

2020-12-01 12:44:44

PythonHook鉤子函數(shù)

2009-11-17 14:50:50

Oracle調優(yōu)

2021-04-19 23:29:44

MakefilemacOSLinux

2021-01-11 09:33:37

Maven數(shù)目項目

2020-11-10 16:01:25

程序員設計模式技術

2025-01-20 08:50:00

2012-06-28 10:26:51

Silverlight
點贊
收藏

51CTO技術棧公眾號

秋霞毛片久久久久久久久| 欧美有码在线视频| 色哟哟免费视频| 福利写真视频网站在线| 成人精品视频.| 欧美在线观看网址综合| 东方伊人免费在线观看| 日本精品一区二区三区在线观看视频| 亚洲图片欧美视频| 奇米精品在线| 99热这里只有精品99| 亚洲作爱视频| 日韩一二三在线视频播| 四虎永久免费观看| 精品网站在线| 午夜精品一区在线观看| 亚洲图片都市激情| 婷婷av一区二区三区| 蜜臀av亚洲一区中文字幕| 欧美肥婆姓交大片| 三年中国中文观看免费播放| 91精品尤物| 欧美日韩亚洲丝袜制服| 少妇高潮毛片色欲ava片| 在线免费看a| 91在线国产福利| 亚洲va久久久噜噜噜| 五月婷婷色丁香| 国产一区二区三区四区三区四| 亚洲天堂免费在线| 国产乱了高清露脸对白| 日韩欧美中文字幕一区二区三区 | 精品日韩在线观看| 牛夜精品久久久久久久| 岛国av免费在线观看| 亚洲免费观看高清| 亚洲欧美日韩国产成人综合一二三区| 女人18毛片水真多18精品| 久久电影网电视剧免费观看| 热门国产精品亚洲第一区在线| 国产亚洲精品久久777777| 亚欧美无遮挡hd高清在线视频| 尤物yw午夜国产精品视频明星| 第四色在线视频| 66精品视频在线观看| 欧美浪妇xxxx高跟鞋交| 五月天激情视频在线观看| 免费v片在线观看| 亚洲www啪成人一区二区麻豆 | 亚洲伦理精品| 久久777国产线看观看精品| 女人18毛片毛片毛片毛片区二| 精品国产网站| 国产一区二区三区高清在线观看| 日本黄色片在线播放| 欧美亚视频在线中文字幕免费| 精品美女一区二区三区| 久久久国产精品久久久| 日韩视频一二区| 日韩精品一区二区三区在线播放| 亚洲成人手机在线观看| 视频欧美精品| 欧美一卡在线观看| 免费在线观看日韩av| 久久国际精品| 亚洲成年网站在线观看| av在线播放网址| 欧美激情影院| 亚洲人成电影网站色| b站大片免费直播| 日本一二区不卡| 久久亚洲国产精品成人av秋霞| 午夜爱爱毛片xxxx视频免费看| 国产精品久久久久久久久妇女| 久久精品国亚洲| 免费在线观看一级片| 欧美亚韩一区| 97在线视频免费| 无码人妻一区二区三区线| 日韩黄色免费电影| 成人做爰www免费看视频网站| 99热这里只有精品5| 成人午夜大片免费观看| 免费久久久一本精品久久区| a天堂在线资源| 综合久久综合久久| 国产精品www在线观看| 美女av在线免费看| 欧美午夜在线观看| 日本成人在线免费观看| 久久a级毛片毛片免费观看| 亚洲香蕉成视频在线观看| 亚洲区一区二区三| 亚洲免费观看| 国产一区二区视频在线观看| 亚洲成人中文字幕在线| 久久久国际精品| 国产一区二区三区在线免费| 亚洲性色av| 欧美一区二区视频在线观看2020 | 欧美大片在线影院| 青青国产在线观看| 麻豆成人免费电影| 国产欧美日韩伦理| 色三级在线观看| 五月婷婷久久丁香| 亚洲 国产 图片| 青青操综合网| 免费不卡在线观看av| 男人午夜免费视频| 国产精品一区二区三区四区| 欧洲成人一区二区| 国产99re66在线视频| 欧美视频在线播放| 国产又粗又长又爽| 亚洲精品97| 国产精品久久久亚洲| 99草在线视频| 欧美激情中文字幕一区二区| 亚洲 自拍 另类小说综合图区| 久久精品xxxxx| 亚洲裸体xxxx| 日韩精品一区二区在线播放| 国产一区二区三区在线看麻豆| 欧美精品v日韩精品v国产精品| av网站导航在线观看免费| 欧美性色黄大片手机版| 欧美大片免费播放器| 欧美区国产区| 91情侣偷在线精品国产| 在线观看麻豆| 欧美亚男人的天堂| 波多野结衣一本| 日韩视频精品在线观看| 91手机在线播放| 黄色成人在线| 欧美精品三级在线观看| xxxx日本黄色| 日精品一区二区| 欧美日韩天天操| 都市激情综合| 亚洲乱码一区av黑人高潮| 圆产精品久久久久久久久久久| 国产成人丝袜美腿| 国产 欧美 日本| 日韩视频在线直播| 久久这里有精品视频| 国产精品久久久久久免费免熟| 国产精品毛片大码女人| 天天爽天天爽夜夜爽| 精品国产一区二区三区av片| 国产成人福利网站| 国产露出视频在线观看| 欧美亚洲综合一区| 在线观看免费小视频| 美女久久久精品| 亚洲三级一区| 国产免费区一区二区三视频免费| 久久精品国产久精国产一老狼| 国产精品乱码一区二区| 亚洲精品国产成人久久av盗摄| 欧美日韩久久婷婷| 欧美黄色免费| 精品视频在线观看| videos性欧美另类高清| 夜夜嗨av一区二区三区免费区| 亚洲性猛交富婆| 日韩美女啊v在线免费观看| 中文字幕第三区| 伊人狠狠色j香婷婷综合| 狠狠色综合欧美激情| 最新日韩精品| 国产一区二区三区视频 | 欧美xx视频| 亚洲亚裔videos黑人hd| 亚洲一级视频在线观看| 亚洲精品福利视频网站| 国产白袜脚足j棉袜在线观看| 一区二区黄色| 亚洲国产精品综合| 蜜桃在线一区| 欧洲精品久久久| 日本高清在线观看wwwww色| 日韩一级片网址| 精品欧美一区二区三区免费观看| 国产欧美综合在线观看第十页| 亚洲va在线va天堂va偷拍| 欧美天堂亚洲电影院在线观看| 国产精品久久亚洲7777| 日韩在线影院| 久久999免费视频| 水莓100国产免费av在线播放| 欧美日韩在线三级| 国产一级特黄视频| 国产女主播在线一区二区| 中文字幕1区2区| 日日噜噜夜夜狠狠视频欧美人 | 九九九九精品| 久久国产三级| 欧美在线观看一区二区三区| 欧洲日本在线| 亚洲精品视频在线播放| 91黄色在线视频| 色综合网色综合| 国产亚洲精品久久777777| 国产女人aaa级久久久级 | 国产老妇伦国产熟女老妇视频| 亚洲超丰满肉感bbw| 九九热视频在线免费观看| 99国产欧美另类久久久精品| 欧美丝袜在线观看| 美女黄色成人网| 996这里只有精品| 日韩国产在线| 欧美成人第一区| 中文字幕一区二区三区中文字幕| 国产精品久久久久久久久久久新郎| 久草在线视频资源| 久久精品国亚洲| 国产三级在线| 亚洲欧美在线磁力| 男人天堂一区二区| 日韩午夜av一区| 国产精品无码AV| 欧美系列一区二区| 国产午夜麻豆影院在线观看| 香蕉成人啪国产精品视频综合网| 欧洲美女女同性互添| 欧美激情一区不卡| 欧美做受xxxxxⅹ性视频| av动漫一区二区| 丰满少妇xbxb毛片日本| 国产精一品亚洲二区在线视频| 亚洲一级免费观看| 日本大胆欧美人术艺术动态| www国产黄色| 一本色道久久综合一区 | 激情视频网站在线播放色 | 91精品xxx在线观看| 国产91成人video| 鲁鲁在线中文| 91大神在线播放精品| 96av在线| 91tv亚洲精品香蕉国产一区7ujn| 3344国产永久在线观看视频| 欧美精品www在线观看| 色yeye免费人成网站在线观看| 久久久成人精品视频| 老司机精品视频在线观看6| 日韩中文视频免费在线观看| www日韩tube| 色多多国产成人永久免费网站| av在线电影网| 久久精品久久久久久国产 免费| 欧美jizzhd69巨大| 久久中文字幕在线| 在线三级中文| 久久久欧美精品| 美女露胸视频在线观看| 日本一区二区在线免费播放| 日本少妇一区| 国产精品入口免费视频一| 四虎影视国产精品| 亚洲自拍偷拍福利| 国产成人福利av| 蜜桃视频成人| 成人羞羞视频在线看网址| 国产又爽又黄ai换脸| 国产精品videosex极品| 黄页免费在线观看视频| 视频一区视频二区中文| 国产精品视频中文字幕| 国产精品一区二区视频| jizz日本免费| 国产精品色呦呦| 欧美人妻精品一区二区三区| 亚洲大片精品永久免费| 无码视频一区二区三区| 欧美精品一二三| 天堂成人在线观看| 国产亚洲欧洲高清一区| 黄色网在线免费观看| 97视频色精品| 国产精品高潮久久| 国产98在线|日韩| 国产精品一区二区99| 中文字幕一区二区三区在线乱码| 好看不卡的中文字幕| 成人在线观看a| 韩国av一区二区三区在线观看| 天堂www中文在线资源| 欧美国产在线观看| 久久久久久久九九九九| 91久久久免费一区二区| www日本高清视频| 亚洲男子天堂网| 在线观看小视频| 日本伊人精品一区二区三区介绍| 国产情侣一区在线| 欧美日韩精品不卡| 欧美一区二区三区久久精品茉莉花| 黄色影院一级片| 国产美女一区二区三区| 少妇久久久久久久久久| 亚洲自拍欧美精品| 亚洲大尺度在线观看| 精品国产一区久久| 9191在线| 日韩av大片在线| 粉嫩av一区二区| 五月天色婷婷综合| 石原莉奈一区二区三区在线观看| youjizz.com日本| 亚洲欧洲精品一区二区精品久久久 | 青青a在线精品免费观看| 在线一区二区三区视频| 在线观看一区二区三区三州| 性xx色xx综合久久久xx| 美女露出粉嫩尿囗让男人桶| 18涩涩午夜精品.www| 国产在线一级片| 日韩成人在线免费观看| 毛片在线导航| 91久久综合亚洲鲁鲁五月天| 精品亚洲成人| 黄色一级一级片| 91在线你懂得| 奇米影视第四色777| 日韩女优电影在线观看| 黄色视屏免费在线观看| 国产欧美在线视频| 国产精品羞羞答答在线观看| 日本一道本久久| 99久久国产综合精品女不卡| 免费一级黄色大片| 91麻豆精品国产91久久久资源速度| www黄在线观看| 国产精品嫩草影院久久久| 国产欧美一区二区精品久久久| 国产亚洲欧美在线视频| 91网站黄www| 欧美亚洲精品天堂| 日韩av在线网址| 色资源二区在线视频| 欧美高清性xxxxhd| 亚洲一区二区三区高清不卡| 一起草在线视频| 欧美三级免费观看| 你懂的免费在线观看| 日本一区二区在线播放| 欧洲专线二区三区| 九九视频精品在线观看| 国产精品毛片久久久久久久| 国产精品热久久| 欧美精品一区三区| 天堂va在线高清一区| 日本人妻伦在线中文字幕| 国产suv精品一区二区三区| 男女免费视频网站| 亚洲丁香婷深爱综合| 性欧美18~19sex高清播放| 欧美综合激情| 久久黄色级2电影| www欧美com| 亚洲风情亚aⅴ在线发布| 青青青免费在线视频| 日本不卡一区二区三区视频| 蜜臀av一级做a爰片久久| 欧美做爰爽爽爽爽爽爽| 精品国产精品网麻豆系列| 在线播放高清视频www| 日韩久久久久久久久久久久久| 精品在线你懂的| 国产中文字字幕乱码无限| 亚洲老头老太hd| av一级久久| 青娱乐自拍偷拍| 中文字幕久久午夜不卡| av片免费播放| 91精品国产网站| 久久久影院免费| 日本性生活一级片| 在线视频观看一区| bt在线麻豆视频| 久草一区二区| 久草这里只有精品视频| 91久久国产视频| 最新69国产成人精品视频免费| 日韩在线精品强乱中文字幕| 人妻有码中文字幕| 亚洲欧美视频在线观看视频| 人妻无码中文字幕| 国产欧美一区二区三区久久 | 久久精品免费一区二区| 国产精品女人毛片| 深爱激情五月婷婷| 国产一区二区丝袜| 午夜亚洲性色视频| 国产精品久久久精品四季影院| 亚洲精品综合精品自拍|