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

前端必懂的設計模式-門面模式

開發 前端
外觀模式(Facade Pattern)又叫門面模式,指提供一個統一的接口去訪問多個子系統的多個不同的接口,為子系統中的一組接口提供統一的高層接口。使得子系統更容易使用,不僅簡化類中的接口,而且實現調用者和接口的解耦。

1. 定義

外觀模式(Facade Pattern)又叫門面模式,指提供一個統一的接口去訪問多個子系統的多個不同的接口,為子系統中的一組接口提供統一的高層接口。使得子系統更容易使用,不僅簡化類中的接口,而且實現調用者和接口的解耦。

2. 類圖

該設計模式由以下角色組成

門面角色:

外觀模式的核心。它被客戶角色調用,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合 子系統角色:實現了子系統的功能。它對客戶角色和Facade是未知的。

子系統角色:

實現了子系統的功能。它對客戶角色和Facade是未知的

客戶角色

通過調用Facede來完成要實現的功能

門面模式類圖

3. 一個生活中的例子

比如常見的空調、冰箱、洗衣機,內部結構都并不簡單,對于我們使用者而言,理解他們內部的運行機制的門檻比較高,但是理解遙控器/控制面板上面寥寥幾個按鈕就相對容易的多,這就是外觀模式的意義。

遙控器

在類似場景中,這些例子有以下特點:

一個統一的外觀為復雜的子系統提供一個簡單的高層功能接口。 原本訪問者直接調用子系統內部模塊導致的復雜引用關系,現在可以通過只訪問這個統一的外觀來避免。

4. 通用實現

在外觀模式中,客戶端直接對接外觀(Facade),通過接口去對接子接口,而子接口里封裝的一系列復雜操作,則不是我們要關注的重點。

結構如下:

外觀模式一般是作為子系統的功能出口出現,使用的時候可以在其中增加新的功能,但是不推薦這樣做,因為外觀應該是對已有功能的包裝,不應在其中摻雜新的功能。

4.1 計算器

class Sum {
sum(a, b) {
return a + b;
}
}
class Minus {
minus(a, b) {
return a - b;
}
}
class Multiply {
multiply(a, b) {
return a * b;
}
}
class Calculator {
sumObj
minusObj
multiplyObj
constructor() {
this.sumObj = new Sum();
this.minusObj = new Minus();
this.multiplyObj = new Multiply();
}
sum(...args) {
return this.sumObj.sum(...args);
}
minus(...args) {
return this.minusObj.minus(...args);
}
multiply(...args) {
return this.multiplyObj.multiply(...args);
}
}
let calculator = new Calculator();
console.log(calculator.sum(1, 2));
console.log(calculator.minus(1, 2));
console.log(calculator.multiply(1, 2));
復制代碼

4.2 計算機

class CPU {
startup() { console.log('打開CPU'); }
shutdown() { console.log('關閉CPU'); }
}
class Memory {
startup() { console.log('打開內存'); }
shutdown() { console.log('關閉內存'); }
}
class Disk {
startup() { console.log('打開硬盤'); }
shutdown() { console.log('關閉硬盤'); }
}
class Computer {
cpu;
memory;
disk;
constructor() {
this.cpu = new CPU();
this.memory = new Memory();
this.disk = new Disk();
}
startup() {
this.cpu.startup();
this.memory.startup();
this.disk.startup();
}
shutdown() {
this.cpu.shutdown();
this.memory.shutdown();
this.disk.shutdown();
}
}
let computer = new Computer();
computer.startup();
computer.shutdown();
復制代碼

4.3 壓縮

export { }
var zlib = require('zlib');
var fs = require('fs');
let path = require('path');
function open(input) {
let ext = path.extname(input);
switch (ext) {
case '.gz':
return unZip(input);
case '.rar':
return unRar(input);
case '.7z':
return un7z(input);
default:
break;
}
}
function unZip(src) {
var gunzip = zlib.createGunzip();
var inputStream = fs.createReadStream(src);
var outputStream = fs.createWriteStream(src.slice(0, -3));
console.log('outputStream');

inputStream.pipe(gunzip).pipe(outputStream);
}
function unRar(src) {
console.log('Rar解壓后的', src);
}
function un7z(src) {
console.log('7z解壓后的', src);
}
open('./source.txt.gz');

function zip(src) {
var gzip = zlib.createGzip();//創建壓縮流
var inputStream = fs.createReadStream(src);
var outputStream = fs.createWriteStream(src+'.gz');
inputStream.pipe(gzip).pipe(outputStream);
}
zip('source.txt');
復制代碼

5. 前端應用場景

5.1 函數參數重載

有一種情況,比如某個函數有多個參數,其中一個參數可以傳遞也可以不傳遞,你當然可以直接弄兩個接口,但是使用函數參數重載的方式,可以讓使用者獲得更大的自由度,讓兩個使用上基本類似的方法獲得統一的外觀。

function bindEvent(elem, type, selector, fn) {
if (fn === undefined) {
fn = selector;
selector = null;
}
// ... 剩下相關邏輯
}

bindEvent(elem, 'click', '#div1', fn)
bindEvent(elem, 'click', fn)

復制代碼

上面這個綁定事件的函數中,參數 selector 就是可選的。

這種方式在一些工具庫或者框架提供的多功能方法上經常得到使用,特別是在通用 API 的某些參數可傳可不傳的時候。

參數重載之后的函數在使用上會獲得更大的自由度,而不必重新創建一個新的 API,這在 Vue、React、jQuery、Lodash 等庫中使用非常頻繁。

5.2 polyfill抹平瀏覽器兼容性問題

polyfill可以讓我們處理瀏覽器兼容和屏蔽了瀏覽器差異。

外觀模式經常被用于 JavaScript 的庫中,封裝一些接口用于兼容多瀏覽器,讓我們可以間接調用我們封裝的外觀,從而屏蔽了瀏覽器差異,便于使用。

比如經常用的兼容不同瀏覽器的事件綁定方法:

function addEvent(element, type, fn) {
if (element.addEventListener) { // 支持 DOM2 級事件處理方法的瀏覽器
element.addEventListener(type, fn, false);
} else if (element.attachEvent) { // 不支持 DOM2 級但支持 attachEvent
element.attachEvent('on' + type, fn);
} else {
element['on' + type] = fn; // 都不支持的瀏覽器
}
}

var myInput = document.getElementById('myinput');

addEvent(myInput, 'click', function() {
console.log('綁定 click 事件');
})
復制代碼

除了事件綁定之外,在抹平瀏覽器兼容性的其他問題上我們也經常使用外觀模式:

// 移除 DOM 上的事件
function removeEvent(element, type, fn) {
if (element.removeEventListener) {
element.removeEventListener(type, fn, false);
} else if (element.detachEvent) {
element.detachEvent('on' + type, fn);
} else {
element['on' + type] = null;
}
}

// 獲取樣式
function getStyle(obj, styleName) {
if (window.getComputedStyle) {
var styles = getComputedStyle(obj, null)[styleName];
} else {
var styles = obj.currentStyle[styleName];
}
return styles;
}

// 阻止默認事件
var preventDefault = function(event) {
if (event.preventDefault) {
event.preventDefault();
} else { // IE 下
event.returnValue = false;
}
}

// 阻止事件冒泡
var cancelBubble = function(event) {
if (event.stopPropagation) {
event.stopPropagation();
} else { // IE 下
event.cancelBubble = true;
}
}

復制代碼

通過將處理不同瀏覽器兼容性問題的過程封裝成一個外觀,我們在使用的時候可以直接使用外觀方法即可,在遇到兼容性問題的時候,這個外觀方法自然幫我們解決,方便又不容易出錯。

5.3 Vue 源碼中的函數參數重載

Vue 提供的一個創建元素的方法 createElement (opens new window)就使用了函數參數重載,使得使用者在使用這個參數的時候很靈活:

export function createElement(
context,
tag,
data,
children,
normalizationType,
alwaysNormalize
) {
if (Array.isArray(data) || isPrimitive(data)) { // 參數的重載
normalizationType = children
children = data
data = undefined
}

// ...
}

復制代碼

createElement 方法里面對第三個參數 data 進行了判斷,如果第三個參數的類型是 array、string、number、boolean 中的一種,那么說明是 createElement(tag [, data], children, ...) 這樣的使用方式,用戶傳的第二個參數不是 data,而是 children。

data 這個參數是包含模板相關屬性的數據對象,如果用戶沒有什么要設置,那這個參數自然不傳,不使用函數參數重載的情況下,需要用戶手動傳遞 null 或者 undefined 之類,參數重載之后,用戶對 data 這個參數可傳可不傳,使用自由度比較大,也很方便。

createElement方法的源碼參見 Github 鏈接vue/src/core/vdom/create-element.js

5.4 Lodash 源碼中的函數參數重載

Lodash 的 range 方法的 API 為 _.range([start=0], end, [step=1]),這就很明顯使用了參數重載,這個方法調用了一個內部函數 createRange:

function createRange(fromRight) {
return (start, end, step) => {
// ...

if (end === undefined) {
end = start
start = 0
}

// ...
}
}

復制代碼

意思就是,如果沒有傳第二個參數,那么就把傳入的第一個參數作為 end,并把 start 置為默認值。

createRange 方法的源碼參見 Github 鏈接
lodash/.internal/createRange.js

5.5 jQuery 源碼中的函數參數重載

函數參數重載在源碼中使用比較多,jQuery 中也有大量使用,比如 on、off、bind、one、load、ajaxPrefilter 等方法,這里以 off 方法為例,該方法在選擇元素上移除一個或多個事件的事件處理函數。源碼如下:

off: function (types, selector, fn) {
// ...

if (selector === false || typeof selector === 'function') {
// ( types [, fn] ) 的使用方式
fn = selector
selector = undefined
}

// ...
}
復制代碼

可以看到如果傳入第二個參數為 false 或者是函數的時候,就是 off(types [, fn]) 的使用方式。

off 方法的源碼參見 Github 鏈接 jquery/src/event.js

再比如 load 方法的源碼:

jQuery.fn.load = function(url, params, callback) {
// ...

if (isFunction(params)) {
callback = params
params = undefined
}

// ...
}

復制代碼

可以看到 jQuery 對第二個參數進行了判斷,如果是函數,就是 load(url [, callback]) 的使用方式。

load 方法的源碼參見 Github 鏈接 jquery/src/ajax/load.js(opens new window)

5.6 jQuery 源碼中的外觀模式

當我們使用 jQuery 的 $(document).ready(...) 來給瀏覽器加載事件添加回調時,jQuery 會使用源碼中的 bindReady 方法:

bindReady: function() {
// ...

// Mozilla, Opera and webkit 支持
if (document.addEventListener) {
document.addEventListener('DOMContentLoaded', DOMContentLoaded, false)

// A fallback to window.onload, that will always work
window.addEventListener('load', jQuery.ready, false)

// 如果使用了 IE 的事件綁定形式
} else if (document.attachEvent) {
document.attachEvent('onreadystatechange', DOMContentLoaded)

// A fallback to window.onload, that will always work
window.attachEvent('onload', jQuery.ready)
}

// ...
}

復制代碼

通過這個方法,jQuery 幫我們將不同瀏覽器下的不同綁定形式隱藏起來,從而簡化了使用。

bindReady 方法的源碼參見 Github 鏈接 jquery/src/core.js

除了屏蔽瀏覽器兼容性問題之外,jQuery 還有其他的一些其他外觀模式的應用:

比如修改 css 的時候可以 $('p').css('color', 'red'),也可以 $('p').css('width', 100),對不同樣式的操作被封裝到同一個外觀方法中,極大地方便了使用,對不同樣式的特殊處理(比如設置 width 的時候不用加 px)也一同被封裝了起來。

源碼參見 Github 鏈接 jquery/src/css.js

再比如 jQuery 的 ajax 的 API ``$.ajax(url [, settings]),當我們在設置以 JSONP 的形式發送請求的時候,只要傳入 dataType: 'jsonp' 設置,jQuery 會進行一些額外操作幫我們啟動 JSONP 流程,并不需要使用者手動添加代碼,這些都被封裝在 $.ajax() 這個外觀方法中了。

源碼參見 Github 鏈接 jquery/src/ajax/jsonp.js

5.7 Axios 源碼中的外觀模式

Axios 可以使用在不同環境中,那么在不同環境中發送 HTTP 請求的時候會使用不同環境中的特有模塊,Axios 這里是使用外觀模式來解決這個問題的:

function getDefaultAdapter() {
// ...

if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {
// Nodejs 中使用 HTTP adapter
adapter = require('./adapters/http');
} else if (typeof XMLHttpRequest !== 'undefined') {
// 瀏覽器使用 XHR adapter
adapter = require('./adapters/xhr');
}

// ...
}

復制代碼

這個方法進行了一個判斷,如果在 Nodejs 的環境中則使用 Nodejs 的 HTTP 模塊來發送請求,在瀏覽器環境中則使用 XMLHTTPRequest 這個瀏覽器 API。

getDefaultAdapter 方法源碼參見 Github 鏈接 axios/lib/defaults.js

5.8 redux createStore

createStore

export default function createStore(reducer, preloadedState, enhancer) {
if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
enhancer = preloadedState
preloadedState = undefined
}
}
復制代碼

6 設計原則驗證

不符合單一職責原則和開放封閉原則,因此謹慎使用,不可濫用

7 外觀模式的優缺點

優點:

  • 訪問者不需要再了解子系統內部模塊的功能,而只需和外觀交互即可,使得訪問者對子系統的使用變得簡單,符合最少知識原則,增強了可移植性和可讀性。
  • 減少了與子系統模塊的直接引用,實現了訪問者與子系統中模塊之間的松耦合,增加了可維護性和可擴展性。
  • 通過合理使用外觀模式,可以幫助我們更好地劃分系統訪問層次,比如把需要暴露給外部的功能集中到外觀中,這樣既方便訪問者使用,也很好地隱藏了內部的細節,提升了安全性。

缺點:

  • 不符合開閉原則,對修改關閉,對擴展開放,如果外觀模塊出錯,那么只能通過修改的方式來解決問題,因為外觀模塊是子系統的唯一出口。
  • 不需要或不合理的使用外觀會讓人迷惑,過猶不及。

7. 外觀模式的適用場景

  • 維護設計粗糙和難以理解的遺留系統,或者系統非常復雜的時候,可以為這些系統設置外觀模塊,給外界提供清晰的接口,以后新系統只需與外觀交互即可。
  • 你寫了若干小模塊,可以完成某個大功能,但日后常用的是大功能,可以使用外觀來提供大功能,因為外界也不需要了解小模塊的功能。
  • 團隊協作時,可以給各自負責的模塊建立合適的外觀,以簡化使用,節約溝通時間。 如果構建多層系統,可以使用外觀模式來將系統分層,讓外觀模塊成為每層的入口,簡化層間調用,松散層間耦合。

8. 其他相關模式

8.1 外觀模式與中介者模式

  • 外觀模式:封裝子使用者對子系統內模塊的直接交互,方便使用者對子系統的調用。
  • 中介者模式:封裝子系統間各模塊之間的直接交互,松散模塊間的耦合。

8.2 外觀模式與單例模式

有時候一個系統只需要一個外觀,比如之前舉的 Axios 的 HTTP 模塊例子。這時我們可以將外觀模式和單例模式一起使用,把外觀實現為單例。

文章出自:??peffy??,如有轉載本文請聯系前端餐廳ReTech今日頭條號。

github:https://github.com/zuopf769


責任編輯:武曉燕 來源: 前端餐廳
相關推薦

2022-02-15 22:45:00

前端設計模式

2022-11-30 17:05:33

代碼程序場景

2021-04-18 21:07:32

門面模式設計

2021-03-18 15:33:22

設計模式外觀

2023-05-06 07:51:22

JavaFacade設計模式

2024-02-19 13:11:38

門面模式系統

2022-02-06 22:30:36

前端設計模式

2022-01-19 08:21:12

設計裝飾器模式

2022-02-11 10:22:48

模版模式語言

2022-04-05 13:56:48

設計模式javascript

2020-11-09 09:10:31

javascript設

2022-01-29 22:12:35

前端模式觀察者

2022-02-13 23:33:24

設計模式Java

2023-12-26 08:20:40

2021-04-19 21:25:48

設計模式到元

2023-10-13 00:00:00

設計模式GO語言

2022-05-27 11:33:02

前端代碼設計模式

2022-05-29 22:55:00

適配器設計模式

2022-12-12 09:20:59

適配器模式接口

2021-02-01 10:01:58

設計模式 Java單例模式
點贊
收藏

51CTO技術棧公眾號

久久在线精品| 精品国产三级| 国产精品你懂的在线欣赏| 国产mv久久久| 天堂网av2018| 欧洲大片精品免费永久看nba| 亚洲免费色视频| 国产在线一区二区三区四区| 中文字幕在线欧美| 91日韩欧美| 精品乱码亚洲一区二区不卡| 成人免费观看视频在线观看| 国产二区在线播放| 国产精品18久久久久久久久| 97高清免费视频| 一级在线观看视频| 视频一区视频二区欧美| 欧美色播在线播放| 在线成人性视频| 天堂中文在线观看视频| 久久综合网络一区二区| 欧美成人一区在线| theav精尽人亡av| 欧美天堂一区二区| 亚洲成人激情自拍| 亚洲精品一品区二品区三品区| 国产男男gay体育生网站| 亚洲韩日在线| 日韩av在线免费| 久久国产精品国产精品| 99视频免费在线观看| 91一区二区三区在线观看| 久久久久久久久久久久av| 四虎国产精品成人免费入口| 欧美三级一区| 欧洲亚洲国产日韩| 91精品国产91久久久久麻豆 主演| 国产一级在线| 成人av网站在线观看免费| 国产伦精品免费视频| 日本熟妇色xxxxx日本免费看| jlzzjlzz亚洲女人| 日韩成人在线视频网站| 欧美精品色视频| 户外露出一区二区三区| 亚洲风情在线资源站| 亚洲综合视频一区| 久久久久久女乱国产| 懂色中文一区二区在线播放| 91精品视频在线免费观看| 久久国产视频精品| 尤物精品在线| 欧美激情一区二区久久久| 男人天堂资源网| 国产免费久久| 日韩第一页在线| wwwxx日本| 视频欧美一区| 91麻豆精品国产| 一个色综合久久| 国内欧美日韩| 欧美精品久久99| 999在线观看| 巨大黑人极品videos精品| 欧美性黄网官网| 日本免费不卡一区二区| www.8ⅹ8ⅹ羞羞漫画在线看| 亚洲人亚洲人成电影网站色| 深田咏美在线x99av| 久草视频在线看| 国产亚洲精品久| 日本一区二区三区www| 精品视频一二三| 日本一区二区三区在线不卡| 欧美一区二区三区四区在线观看地址 | 久久九九99视频| 久久精品aaaaaa毛片| 日本人妻丰满熟妇久久久久久| 国产91丝袜在线观看| 91久久偷偷做嫩草影院| wwwav在线播放| 岛国一区二区在线观看| 国产精品传媒毛片三区| 日韩一级片免费看| 2019国产精品| 日韩精品av一区二区三区| 国产69久久| 中文字幕一区二区三区不卡在线| 黄瓜视频免费观看在线观看www| 蜜芽在线免费观看| 亚洲激情第一区| 欧美乱大交xxxxx潮喷l头像| 日韩伦理福利| 一本色道a无线码一区v| 中文字幕国内自拍| 国产精品麻豆| 亚洲成人黄色在线观看| 瑟瑟视频在线观看| 天天综合一区| 欧美激情手机在线视频 | 亚洲综合区在线| 国产一区二区网| 蜜桃视频成人m3u8| 这里只有精品免费| 亚洲少妇18p| 国产亚洲欧美日韩在线观看一区二区| 一区二区中文字幕| 校园春色 亚洲| 亚洲中字黄色| 91久久精品国产91性色| 好男人在线视频www| 久久免费美女视频| 好色先生视频污| 女人让男人操自己视频在线观看 | 久久先锋资源网| 亚洲午夜在线观看| 大桥未久在线播放| 欧美日韩亚洲综合在线 | 激情伊人五月天| 国产精品久久久久77777丨| 日韩欧美专区在线| 亚洲调教欧美在线| 国产国产精品| 欧美性视频精品| 一二三区中文字幕| 国产黄色精品网站| 日本日本精品二区免费| 99视频免费在线观看| 日韩欧美精品在线观看| 天美一区二区三区| 国产欧美一区二区精品久久久| 色偷偷88888欧美精品久久久| avtt天堂在线| 久久精品亚洲| 国产精品国产精品国产专区蜜臀ah| 五月婷婷开心中文字幕| 一区二区三区中文字幕| 欧美日韩在线免费播放| 亚洲视频一起| 色婷婷久久一区二区| 潘金莲一级淫片aaaaaa播放| 不卡视频在线看| 黄黄视频在线观看| 精品九九久久| 在线观看国产精品91| 国产又大又黑又粗免费视频| 国产精品自在欧美一区| 亚洲午夜精品久久久久久浪潮| 制服丝袜专区在线| 亚洲国产精品电影| 毛片aaaaa| 国产一区福利在线| 一区二区视频在线观看| 香蕉成人av| 日韩精品在线看| 黄色小视频在线免费看| 国产成人av资源| 国内外成人激情免费视频| 成人全视频免费观看在线看| 亚洲视频在线观看| 日韩欧美成人一区二区三区| av电影一区二区| 国产精品久久久久9999爆乳| 国产精品视频一区二区三区综合| 最近中文字幕2019免费| 中文字幕人妻互换av久久| 久久精品免费在线观看| 久草综合在线观看| 欧美猛男男男激情videos| 欧美综合一区第一页| 青青草娱乐在线| 日本福利一区二区| 黄色三级生活片| 精品一区二区三区视频| 一区二区三区av| 国产一区二区高清在线| 欧美理论电影在线观看| 亚洲国产精品suv| 亚洲国产精品嫩草影院| 亚洲国产精品自拍视频| 裸体一区二区| 亚洲精品自在在线观看| 四虎成人精品一区二区免费网站| www.亚洲一区| 亚洲第九十九页| 午夜伦欧美伦电影理论片| av电影中文字幕| 亚洲精品社区| 国产在线一区二区三区播放| 欧洲av不卡| 日韩网站在线观看| www国产在线| 黄色成人av在线| 无码人妻aⅴ一区二区三区69岛| 日本中文字幕一区二区视频| 一区二区欧美日韩| 精品三级av| 国产精品老女人精品视频| a天堂中文在线官网在线| 精品毛片乱码1区2区3区| 超碰超碰超碰超碰| 亚洲色图欧洲色图| 亚洲AV无码国产精品| 免费在线观看视频一区| 久久久国内精品| 国产成人福利视频| 看片网站在线观看| 成人免费高清在线| 国产麻花豆剧传媒精品mv在线| 亚洲 欧美 自拍偷拍| 欧美日韩国产精品| 亚洲av毛片基地| 成人性生交大合| 在线观看免费黄网站| 亚洲美女91| 2025韩国大尺度电影| 美国十次av导航亚洲入口| 全球成人中文在线| 午夜精品一区| 亚洲国产成人在线播放| 日本三级一区二区三区| 亚洲欧美日韩一区二区| caopor在线| 美洲天堂一区二卡三卡四卡视频| 青青青青在线视频| 色天天综合网| 精品亚洲第一| 日韩精品一区二区三区中文在线| 日韩av手机在线观看| 免费在线看电影| 色香阁99久久精品久久久| 午夜福利一区二区三区| 91精品国产综合久久精品| 亚洲精品国产品国语在线app| 日本a在线免费观看| 日韩精品久久| 久久精品中文字幕一区二区三区| 久久91视频| 欧美亚洲免费电影| 手机在线免费看av| 爽爽爽爽爽爽爽成人免费观看| 天天干天天舔天天射| 91麻豆精品国产91久久久久久 | 久久久久久97| 欧美被日视频| 一区二区三区视频在线| 亚洲人妻一区二区| 妺妺窝人体色WWW精品| 欧美三级小说| 一区二区三区视频在线播放| 蜜臀91精品国产高清在线观看| 成人综合色站| 日本精品在线播放| 91香蕉电影院| 四虎国产精品免费久久| 国产精品久久一区| 欧美aaa大片视频一二区| 91成人性视频| 国产午夜福利精品| 亚洲男同性恋视频| 亚洲怡红院在线观看| 国产精品久久夜| 亚洲欧美日韩第一页| 欧美激情中文不卡| 成人激情五月天| 国产日韩精品一区二区浪潮av| 亚洲综合色一区| 久久久久成人黄色影片| 不卡一区二区在线观看| 久久夜色精品一区| 国产吞精囗交久久久| 久久精品欧美日韩精品| 欧美性受xxxx黑人| 亚洲视频在线观看三级| 久久激情免费视频| 亚洲午夜视频在线| 青草影院在线观看| 亚洲一区自拍偷拍| 免费毛片一区二区三区| 精品国产福利在线| 无码人妻aⅴ一区二区三区有奶水| 欧美性猛交xxx| 日韩国产成人在线| 好吊成人免视频| 91黑人精品一区二区三区| 欧美日韩国产三级| 国产精品欧美激情在线| 亚洲精品在线观看网站| 日韩二区三区| 尤物九九久久国产精品的特点 | 在线观看三级网站| 国模 一区 二区 三区| 欧美亚洲另类色图| 久久成人久久鬼色| 久久无码专区国产精品s| 91香蕉视频在线| 91香蕉视频污在线观看| 亚洲国产色一区| av毛片在线免费观看| 欧美男男青年gay1069videost| 亚洲精品中文字幕成人片| 国产婷婷成人久久av免费高清| 欧美69xxxx| 91精品国产精品| 日韩成人一区| 国产欧美日韩在线播放| 日韩系列欧美系列| 国产一区二区视频播放| 蜜桃传媒麻豆第一区在线观看| 成年网站免费在线观看| 丁香亚洲综合激情啪啪综合| 亚洲乱码国产乱码精品精大量| 国产精品欧美久久久久一区二区| 精品亚洲永久免费| 欧美三级在线播放| 天堂中文网在线| 欧美床上激情在线观看| 澳门av一区二区三区| 成人欧美一区二区三区黑人免费| 极品美女一区二区三区| 国产 欧美 日本| 免费成人在线影院| v8888av| 一区二区三区国产| 亚洲一区 中文字幕| 日韩精品免费综合视频在线播放| 毛片在线不卡| 国产精品va在线播放我和闺蜜| 91精品国产自产精品男人的天堂 | 日韩av黄色在线观看| 久久久久毛片免费观看| 欧美精品成人一区二区在线观看| 久久人人99| www.日日操| 99久久国产免费看| 欧美成人综合色| 884aa四虎影成人精品一区| 黄色毛片在线看| 国产91精品视频在线观看| 大奶在线精品| 欧美大黑帍在线播放| 狠狠v欧美v日韩v亚洲ⅴ| 国产精品久久久久久久av| 欧美日韩在线免费观看| 国产自产一区二区| 欧美高清电影在线看| 国产在线一区不卡| 中文字幕一区二区三区在线乱码| 首页欧美精品中文字幕| 熟女少妇一区二区三区| 午夜激情久久久| 你懂的网站在线| 日韩亚洲精品电影| 国产精品天堂蜜av在线播放| 欧美一区2区三区4区公司二百| 亚洲黑丝一区二区| 午夜一区二区视频| 国产精品久久久久久久久动漫 | 亚洲www在线观看| 成人久久综合| 十八禁视频网站在线观看| 91一区二区三区在线观看| 国产一级在线观看视频| 欧美大片一区二区| xxxx成人| 狠狠色综合一区二区| 国产农村妇女精品一区二区| 中文字幕在线播放视频| 黄色成人av网| 黄色电影免费在线看| 国产精品女人久久久久久| 精品一区二区三| 黄色一级大片在线观看| 国产精品亲子乱子伦xxxx裸| 国产精品丝袜黑色高跟鞋| 免费av在线一区| 超碰成人在线观看| 女人和拘做爰正片视频| 国产三级三级三级精品8ⅰ区| 亚洲欧美日韩激情| 久久影视电视剧免费网站清宫辞电视| 香蕉大人久久国产成人av| caopor在线视频| 亚洲美女少妇撒尿| 牛牛影视精品影视| 亚洲xxxx在线| 久久婷婷亚洲| 免费人成视频在线| 国产亚洲精品久久久优势| 欧美久久一区二区三区| 日本激情视频在线| 亚洲国产精品一区二区尤物区| а天堂8中文最新版在线官网| 成人精品一二区| 日韩电影在线免费看| 麻豆一区二区三区精品视频| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 日日夜夜亚洲| av免费中文字幕| 亚洲资源在线观看|