国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

不知道怎么封裝代碼?看看這幾種設(shè)計(jì)模式吧!

開發(fā) 前端
我們經(jīng)常聽說(shuō):“寫代碼要有良好的封裝,要高內(nèi)聚,低耦合”。那怎樣才算良好的封裝,我們?yōu)槭裁匆庋b呢?其實(shí)封裝有這樣幾個(gè)好處,一起來(lái)看看吧。

[[339386]]

為什么要封裝代碼?

我們經(jīng)常聽說(shuō):“寫代碼要有良好的封裝,要高內(nèi)聚,低耦合”。那怎樣才算良好的封裝,我們?yōu)槭裁匆庋b呢?其實(shí)封裝有這樣幾個(gè)好處:

  1.   封裝好的代碼,內(nèi)部變量不會(huì)污染外部。
  2.   可以作為一個(gè)模塊給外部調(diào)用。外部調(diào)用者不需要知道實(shí)現(xiàn)的細(xì)節(jié),只需要按照約定的規(guī)范使用就行了。
  3.   對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,即開閉原則。外部不能修改模塊,既保證了模塊內(nèi)部的正確性,又可以留出擴(kuò)展接口,使用靈活。

怎么封裝代碼?

JS生態(tài)已經(jīng)有很多模塊了,有些模塊封裝得非常好,我們使用起來(lái)很方便,比如jQuery,Vue等。如果我們仔細(xì)去看這些模塊的源碼,我們會(huì)發(fā)現(xiàn)他們的封裝都是有規(guī)律可循的。這些規(guī)律總結(jié)起來(lái)就是設(shè)計(jì)模式,用于代碼封裝的設(shè)計(jì)模式主要有工廠模式,創(chuàng)建者模式,單例模式,原型模式四種。下面我們結(jié)合一些框架源碼來(lái)看看這四種設(shè)計(jì)模式:

工廠模式

工廠模式的名字就很直白,封裝的模塊就像一個(gè)工廠一樣批量的產(chǎn)出需要的對(duì)象。常見工廠模式的一個(gè)特征就是調(diào)用的時(shí)候不需要使用new,而且傳入的參數(shù)比較簡(jiǎn)單。但是調(diào)用次數(shù)可能比較頻繁,經(jīng)常需要產(chǎn)出不同的對(duì)象,頻繁調(diào)用時(shí)不用new也方便很多。一個(gè)工廠模式的代碼結(jié)構(gòu)如下所示: 

  1. function factory(type) {  
  2.   switch(type) {  
  3.     case 'type1':  
  4.       return new Type1();  
  5.     case 'type2':  
  6.       return new Type2();  
  7.     case 'type3':  
  8.       return new Type3();  
  9.   }  

上述代碼中,我們傳入了type,然后工廠根據(jù)不同的type來(lái)創(chuàng)建不同的對(duì)象。

實(shí)例: 彈窗組件

下面來(lái)看看用工廠模式的例子,假如我們有如下需求:

我們項(xiàng)目需要一個(gè)彈窗,彈窗有幾種:消息型彈窗,確認(rèn)型彈窗,取消型彈窗,他們的顏色和內(nèi)容可能是不一樣的。

針對(duì)這幾種彈窗,我們先來(lái)分別建一個(gè)類: 

  1. function infoPopup(content, color) {}  
  2. function confirmPopup(content, color) {}  
  3. function cancelPopup(content, color) {} 

如果我們直接使用這幾個(gè)類,就是這樣的: 

  1. let infoPopup1 = new infoPopup(content, color);  
  2. let infoPopup2 = new infoPopup(content, color);  
  3. let confirmPopup1 = new confirmPopup(content, color);  
  4. ... 

每次用的時(shí)候都要去new對(duì)應(yīng)的彈窗類,我們用工廠模式改造下,就是這樣: 

  1. // 新加一個(gè)方法popup把這幾個(gè)類都包裝起來(lái)  
  2. function popup(type, content, color) {  
  3.   switch(type) {  
  4.     case 'infoPopup':  
  5.       return new infoPopup(content, color);  
  6.     case 'confirmPopup':  
  7.       return new confirmPopup(content, color);  
  8.     case 'cancelPopup':  
  9.       return new cancelPopup(content, color);  
  10.   }  

然后我們使用popup就不用new了,直接調(diào)用函數(shù)就行: 

  1. let infoPopup1 = popup('infoPopup', content, color); 

改造成面向?qū)ο?/strong>

上述代碼雖然實(shí)現(xiàn)了工廠模式,但是switch始終感覺(jué)不是很優(yōu)雅。我們使用面向?qū)ο蟾脑煜聀opup,將它改為一個(gè)類,將不同類型的彈窗掛載在這個(gè)類上成為工廠方法: 

  1. function popup(type, content, color) {  
  2.   // 如果是通過(guò)new調(diào)用的,返回對(duì)應(yīng)類型的彈窗  
  3.   if(this instanceof popup) {  
  4.     return new this[type](content, color);  
  5.   } else {  
  6.     // 如果不是new調(diào)用的,使用new調(diào)用,會(huì)走到上面那行代碼  
  7.     return new popup(type, content, color);  
  8.   }  
  9.  
  10. // 各種類型的彈窗全部掛載在原型上成為實(shí)例方法  
  11. popup.prototype.infoPopup = function(content, color) {}  
  12. popup.prototype.confirmPopup = function(content, color) {}  
  13. popup.prototype.cancelPopup = function(content, color) {} 

封裝成模塊

這個(gè)popup不僅僅讓我們調(diào)用的時(shí)候少了一個(gè)new,他其實(shí)還把相關(guān)的各種彈窗都封裝在了里面,這個(gè)popup可以直接作為模塊export出去給別人調(diào)用,也可以掛載在window上作為一個(gè)模塊給別人調(diào)用。因?yàn)閜opup封裝了彈窗的各種細(xì)節(jié),即使以后popup內(nèi)部改了,或者新增了彈窗類型,或者彈窗類的名字變了,只要保證對(duì)外的接口參數(shù)不變,對(duì)外面都沒(méi)有影響。掛載在window上作為模塊可以使用自執(zhí)行函數(shù): 

  1. (function(){  
  2.      function popup(type, content, color) {  
  3.     if(this instanceof popup) {  
  4.       return new this[type](content, color);  
  5.     } else {  
  6.       return new popup(type, content, color);  
  7.     }  
  8.   }  
  9.   popup.prototype.infoPopup = function(content, color) {}  
  10.   popup.prototype.confirmPopup = function(content, color) {}  
  11.   popup.prototype.cancelPopup = function(content, color) {} 
  12.   window.popup = popup;  
  13. })()  
  14. // 外面就直接可以使用popup模塊了  
  15. let infoPopup1 = popup('infoPopup', content, color);  

jQuery的工廠模式

jQuery也是一個(gè)典型的工廠模式,你給他一個(gè)參數(shù),他就給你返回符合參數(shù)DOM對(duì)象。那jQuery這種不用new的工廠模式是怎么實(shí)現(xiàn)的呢?其實(shí)就是jQuery內(nèi)部幫你調(diào)用了new而已,jQuery的調(diào)用流程簡(jiǎn)化了就是這樣: 

  1. (function(){  
  2.   var jQuery = function(selector) {  
  3.     return new jQuery.fn.init(selector);   // new一下init, init才是真正的構(gòu)造函數(shù)  
  4.   }  
  5.   jQueryjQuery.fn = jQuery.prototype;     // jQuery.fn就是jQuery.prototype的簡(jiǎn)寫  
  6.   jQuery.fn.init = function(selector) {  
  7.     // 這里面實(shí)現(xiàn)真正的構(gòu)造函數(shù) 
  8.    }  
  9.   // 讓init和jQuery的原型指向同一個(gè)對(duì)象,便于掛載實(shí)例方法  
  10.   jQueryjQuery.fn.init.prototype = jQuery.fn;   
  11.   // 最后將jQuery掛載到window上  
  12.   window.$ = window.jQuery = jQuery;  
  13. })(); 

上述代碼結(jié)構(gòu)來(lái)自于jQuery源碼,從中可以看出,你調(diào)用時(shí)省略的new在jQuery里面幫你調(diào)用了,目的是為了使大量調(diào)用更方便。但是這種結(jié)構(gòu)需要借助一個(gè)init方法,最后還要將jQuery和init的原型綁在一起,其實(shí)還有一種更加簡(jiǎn)便的方法可以實(shí)現(xiàn)這個(gè)需求: 

  1. var jQuery = function(selector) {  
  2.   if(!(this instanceof jQuery)) {  
  3.     return new jQuery(selector);  
  4.   }  
  5.   // 下面進(jìn)行真正構(gòu)造函數(shù)的執(zhí)行  

上述代碼就簡(jiǎn)潔多了,也可以實(shí)現(xiàn)不用new直接調(diào)用,這里利用的特性是this在函數(shù)被new調(diào)用時(shí),指向的是new出來(lái)的對(duì)象,new出來(lái)的對(duì)象自然是類的instance,這里的this instanceof jQuery就是true。如果是普通調(diào)用,他就是false,我們就幫他new一下。

建造者模式

建造者模式是用于比較復(fù)雜的大對(duì)象的構(gòu)建,比如Vue,Vue內(nèi)部包含一個(gè)功能強(qiáng)大,邏輯復(fù)雜的對(duì)象,在構(gòu)建的時(shí)候也需要傳很多參數(shù)進(jìn)去。像這種需要?jiǎng)?chuàng)建的情況不多,創(chuàng)建的對(duì)象本身又很復(fù)雜的時(shí)候就適用建造者模式。建造者模式的一般結(jié)構(gòu)如下: 

  1. function Model1() {}   // 模塊1  
  2. function Model2() {}   // 模塊2  
  3. // 最終使用的類  
  4. function Final() {  
  5.   this.model1 = new Model1();  
  6.   this.model2 = new Model2();  
  7.  
  8. // 使用時(shí)  
  9. var obj = new Final(); 

上述代碼中我們最終使用的是Final,但是Final里面的結(jié)構(gòu)比較復(fù)雜,有很多個(gè)子模塊,F(xiàn)inal就是將這些子模塊組合起來(lái)完成功能,這種需要精細(xì)化構(gòu)造的就適用于建造者模式。

實(shí)例:編輯器插件

假設(shè)我們有這樣一個(gè)需求:

寫一個(gè)編輯器插件,初始化的時(shí)候需要配置大量參數(shù),而且內(nèi)部的功能很多很復(fù)雜,可以改變字體顏色和大小,也可以前進(jìn)后退。

一般一個(gè)頁(yè)面就只有一個(gè)編輯器,而且里面的功能可能很復(fù)雜,可能需要調(diào)整顏色,字體等。也就是說(shuō)這個(gè)插件內(nèi)部可能還會(huì)調(diào)用其他類,然后將他們組合起來(lái)實(shí)現(xiàn)功能,這就適合建造者模式。我們來(lái)分析下做這樣一個(gè)編輯器需要哪些模塊:

  1.   編輯器本身肯定需要一個(gè)類,是給外部調(diào)用的接口
  2.   需要一個(gè)控制參數(shù)初始化和頁(yè)面渲染的類
  3.   需要一個(gè)控制字體的類
  4.   需要一個(gè)狀態(tài)管理的類 
  1. // 編輯器本身,對(duì)外暴露  
  2. function Editor() {  
  3.   // 編輯器里面就是將各個(gè)模塊組合起來(lái)實(shí)現(xiàn)功能  
  4.   this.initer = new HtmlInit();  
  5.   this.fontController = new FontController();  
  6.   this.stateController = new StateController(this.fontController);  
  7.  
  8. // 初始化參數(shù),渲染頁(yè)面  
  9. function HtmlInit() { 
  10.   
  11. HtmlInit.prototype.initStyle = function() {}     // 初始化樣式  
  12. HtmlInit.prototype.renderDom = function() {}     // 渲染DOM  
  13. // 字體控制器  
  14. function FontController() {  
  15.  
  16. FontController.prototype.changeFontColor = function() {}    // 改變字體顏色  
  17. FontController.prototype.changeFontSize = function() {}     // 改變字體大小  
  18. // 狀態(tài)控制器  
  19. function StateController(fontController) {  
  20.   this.states = [];       // 一個(gè)數(shù)組,存儲(chǔ)所有狀態(tài)  
  21.   this.currentState = 0;  // 一個(gè)指針,指向當(dāng)前狀態(tài)  
  22.   this.fontController = fontController;    // 將字體管理器注入,便于改變狀態(tài)的時(shí)候改變字體  
  23.  
  24. StateController.prototype.saveState = function() {}     // 保存狀態(tài)  
  25. StateController.prototype.backState = function() {}     // 后退狀態(tài)  
  26. StateController.prototype.forwardState = function() {}     // 前進(jìn)狀態(tài) 

上面的代碼其實(shí)就將一個(gè)編輯器插件的架子搭起來(lái)了,具體實(shí)現(xiàn)功能就是往這些方法里面填入具體的內(nèi)容就行了,其實(shí)就是各個(gè)模塊的相互調(diào)用,比如我們要實(shí)現(xiàn)后退狀態(tài)的功能就可以這樣寫: 

  1. StateController.prototype.backState = function() {  
  2.   var state = this.states[this.currentState - 1];  // 取出上一個(gè)狀態(tài)  
  3.   this.fontController.changeFontColor(state.color);  // 改回上次顏色  
  4.   this.fontController.changeFontSize(state.size);    // 改回上次大小  

單例模式

單例模式適用于全局只能有一個(gè)實(shí)例對(duì)象的場(chǎng)景,單例模式的一般結(jié)構(gòu)如下: 

  1. function Singleton() {} 
  2.  Singleton.getInstance = function() {  
  3.   if(this.instance) {  
  4.     return this.instance;  
  5.   }  
  6.   this.instance = new Singleton();  
  7.   return this.instance;  

上述代碼中,Singleton類掛載了一個(gè)靜態(tài)方法getInstance,如果要獲取實(shí)例對(duì)象只能通過(guò)這個(gè)方法拿,這個(gè)方法會(huì)檢測(cè)是不是有現(xiàn)存的實(shí)例對(duì)象,如果有就返回,沒(méi)有就新建一個(gè)。

實(shí)例:全局?jǐn)?shù)據(jù)存儲(chǔ)對(duì)象

假如我們現(xiàn)在有這樣一個(gè)需求:

我們需要對(duì)一個(gè)全局的數(shù)據(jù)對(duì)象進(jìn)行管理,這個(gè)對(duì)象只能有一個(gè),如果有多個(gè)會(huì)導(dǎo)致數(shù)據(jù)不同步。

這個(gè)需求要求全局只有一個(gè)數(shù)據(jù)存儲(chǔ)對(duì)象,是典型的適合單例模式的場(chǎng)景,我們可以直接套用上面的代碼模板,但是上面的代碼模板獲取instance必須要調(diào)getInstance才行,要是某個(gè)使用者直接調(diào)了Singleton()或者new Singleton()就會(huì)出問(wèn)題,這次我們換一種寫法,讓他能夠兼容Singleton()和new Singleton(),使用起來(lái)更加傻瓜化: 

  1. function store() {  
  2.   if(store.instance) {  
  3.     return store.instance;  
  4.   }  
  5.   store.instance = this 

上述代碼支持使用new store()的方式調(diào)用,我們使用了一個(gè)靜態(tài)變量instance來(lái)記錄是否有進(jìn)行過(guò)實(shí)例化,如果實(shí)例化了就返回這個(gè)實(shí)例,如果沒(méi)有實(shí)例化說(shuō)明是第一次調(diào)用,那就把this賦給這個(gè)這個(gè)靜態(tài)變量,因?yàn)槭鞘褂胣ew調(diào)用,這時(shí)候的this指向的就是實(shí)例化出來(lái)的對(duì)象,并且最后會(huì)隱式的返回this。

如果我們還想支持store()直接調(diào)用,我們可以用前面工廠模式用過(guò)的方法,檢測(cè)this是不是當(dāng)前類的實(shí)例,如果不是就幫他用new調(diào)用就行了: 

  1. function store() {  
  2.   // 加一個(gè)instanceof檢測(cè)  
  3.   if(!(this instanceof store)) {  
  4.     return new store();  
  5.   }   
  6.   // 下面跟前面一樣的  
  7.   if(store.instance) {  
  8.     return store.instance;  
  9.   } 
  10.    store.instance = this
  11.  

然后我們用兩種方式調(diào)用來(lái)檢測(cè)下:

實(shí)例:vue-router

vue-router其實(shí)也用到了單例模式,因?yàn)槿绻粋€(gè)頁(yè)面有多個(gè)路由對(duì)象,可能造成狀態(tài)的沖突,vue-router的單例實(shí)現(xiàn)方式又有點(diǎn)不一樣,下列代碼來(lái)自vue-router源碼: 

  1. let _Vue;  
  2. function install(Vue) {  
  3.   if (install.installed && _Vue === Vue) return;  
  4.   install.installed = true  
  5.   _Vue = Vue  

每次我們調(diào)用vue.use(vueRouter)的時(shí)候其實(shí)都會(huì)去執(zhí)行vue-router模塊的install方法,如果用戶不小心多次調(diào)用了vue.use(vueRouter)就會(huì)造成install的多次執(zhí)行,從而產(chǎn)生不對(duì)的結(jié)果。vue-router的install在第一次執(zhí)行時(shí),將installed屬性寫成了true,并且記錄了當(dāng)前的Vue,這樣后面在同一個(gè)Vue里面再次執(zhí)行install就會(huì)直接return了,這也是一種單例模式。

可以看到我們這里三種代碼都是單例模式,他們雖然形式不一樣,但是核心思想都是一樣的,都是用一個(gè)變量來(lái)標(biāo)記代碼是否已經(jīng)執(zhí)行過(guò)了,如果執(zhí)行過(guò)了就返回上次的執(zhí)行結(jié)果,這樣就保證了多次調(diào)用也會(huì)拿到一樣的結(jié)果。

原型模式

原型模式最典型的應(yīng)用就是JS本身啊,JS的原型鏈就是原型模式。JS中可以使用Object.create指定一個(gè)對(duì)象作為原型來(lái)創(chuàng)建對(duì)象: 

  1. const obj = {  
  2.   x: 1,  
  3.   func: () => {}  
  4.  
  5. // 以obj為原型創(chuàng)建一個(gè)新對(duì)象  
  6. const newObj = Object.create(obj);  
  7. console.log(newObj.__proto__ === obj);    // true  
  8. console.log(newObj.x);    // 1 

上述代碼我們將obj作為原型,然后用Object.create創(chuàng)建的新對(duì)象都會(huì)擁有這個(gè)對(duì)象上的屬性和方法,這其實(shí)就算是一種原型模式。還有JS的面向?qū)ο笃鋵?shí)更加是這種模式的體現(xiàn),比如JS的繼承可以這樣寫: 

  1. function Parent() {  
  2.   this.parentAge = 50 
  3.  
  4. function Child() {}  
  5. Child.prototype = new Parent();  
  6. ChildChild.prototype.constructor = Child;      // 注意重置constructor  
  7. const obj = new Child();  
  8. console.log(obj.parentAge);    // 50 

這里的繼承其實(shí)就是讓子類Child.prototype.__proto__的指向父類的prototype,從而獲取父類的方法和屬性。JS中面向?qū)ο蟮膬?nèi)容較多,我這里不展開了,有一篇文章專門講這個(gè)問(wèn)題

總結(jié)

  1.  很多用起來(lái)順手的開源庫(kù)都有良好的封裝,封裝可以將內(nèi)部環(huán)境和外部環(huán)境隔離,外部用起來(lái)更順手。
  2.  針對(duì)不同的場(chǎng)景可以有不同的封裝方案。
  3.  需要大量產(chǎn)生類似實(shí)例的組件可以考慮用工廠模式來(lái)封裝。
  4.  內(nèi)部邏輯較復(fù)雜,外部使用時(shí)需要的實(shí)例也不多,可以考慮用建造者模式來(lái)封裝。
  5.  全局只能有一個(gè)實(shí)例的需要用單例模式來(lái)封裝。
  6.  新老對(duì)象之間可能有繼承關(guān)系的可以考慮用原型模式來(lái)封裝,JS本身就是一個(gè)典型的原型模式。
  7.  使用設(shè)計(jì)模式時(shí)不要生搬硬套代碼模板,更重要的是掌握思想,同一個(gè)模式在不同的場(chǎng)景可以有不同的實(shí)現(xiàn)方案。 

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2021-06-27 21:37:27

緩存雪崩穿透

2021-04-13 11:10:09

Windows 10Windows微軟

2021-09-07 11:20:02

binlogMySQL數(shù)據(jù)庫(kù)

2021-08-04 08:31:10

MySQL數(shù)據(jù)庫(kù)日志

2019-07-23 15:56:56

Spring Boot部署servlet

2021-01-21 05:52:11

斷言assert程序員

2019-07-23 17:52:59

Spring BootJava開發(fā)

2021-06-03 08:05:46

VSCode 代碼高亮原理前端

2018-07-13 15:15:09

2020-06-12 09:20:33

前端Blob字符串

2020-07-28 08:26:34

WebSocket瀏覽器

2010-10-20 09:10:29

私有云

2014-10-21 11:17:41

蘋果設(shè)計(jì)

2022-07-17 06:53:24

微服務(wù)架構(gòu)

2018-09-02 15:43:56

Python代碼編程語(yǔ)言

2021-08-10 23:09:55

區(qū)塊鏈數(shù)據(jù)技術(shù)

2021-10-22 09:41:26

橋接模式設(shè)計(jì)

2022-05-30 08:18:35

門面模式子系統(tǒng)對(duì)象

2023-11-15 08:22:42

Java開發(fā)小技巧

2025-08-18 02:55:00

Spring數(shù)據(jù)庫(kù)容器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩国产小视频| 成人片在线播放| 国产福利91精品一区二区| 欧美午夜精品久久久久久孕妇 | 日韩第一页在线| 麻豆电影在线观看| 欧美啪啪免费视频| 久久影院视频免费| 亚洲嫩模很污视频| 嫩草av久久伊人妇女超级a| 成人va天堂| 日韩毛片视频在线看| 黄色成人影院| 亚洲国产成人tv| 亚洲综合视频一区| 狠狠狠色丁香婷婷综合久久五月| 国产999在线| 国产在线一二| 久久精品免费播放| 成人四虎影院| 久热成人在线视频| 分分操这里只有精品| 久久天堂久久| 日韩成人久久| 色综合天天天天做夜夜夜夜做| 免费看a级黄色片| 亚洲精品国产精品国自产观看浪潮| 黄色网在线播放| 精品国产一区二区在线观看| 三妻四妾的电影电视剧在线观看| 在线观看一区| 亚洲一区在线观看视频| 国产精品99久久久久| 国产美女精品久久久| 日本福利一区| 日韩av电影手机在线| www.成人网| 中文字幕日韩综合av| 欧美久久久网站| 国产一区二区成人| 成人在线日韩| 欧美成人第一页| 国产精品毛片aⅴ一区二区三区| 精品无人国产偷自产在线| segui88久久综合| 在线日韩av观看| 九九九九九九精品任你躁| 正在播放欧美视频| 国产区精品视频在线观看豆花| 欧美极品少妇与黑人| 国产精品国产三级国产在线观看 | 久久精品毛片| 国产精品扒开腿做爽爽爽男男 | 亚洲精品网站在线播放gif| 一区二区三区午夜探花| 久久久免费高清电视剧观看| 最新国产精品精品视频| 日本成人免费在线| 日韩欧美视频专区| 欧美资源一区| 国产精品12区| 国内自拍视频一区| 色欧美片视频在线观看在线视频| 麻豆导航在线观看| 亚洲美女av黄| 亚洲精品一二三**| 国产精品91久久久| 久久精品欧洲| 精品人妻一区二区三区四区在线| 亚洲一区二区三区爽爽爽爽爽 | 国产一精品一av一免费爽爽| 久久精品电影网| 国产欧美日韩精品一区二区免费| 国产精品乱码| 国产午夜精品一区二区三区视频| 小草在线视频在线免费视频| 日韩高清免费在线| 老牛精品亚洲成av人片| 国产成人女人毛片视频在线| 91丨九色丨国产丨porny| 中国国产一级毛片| 亚洲欧美国产精品va在线观看| 大奶在线精品| 国产精品jizz在线观看老狼| 亚洲人123区| 成人av福利| 国产成人精品电影久久久| 日韩国产精品久久| 青檬在线电视剧在线观看| 精品1区2区在线观看| 青青草综合网| 欧日韩免费视频| 日韩欧美在线视频免费观看| 九七电影院97理论片久久tvb| 91免费欧美精品| aaa亚洲精品一二三区| 黄色成人在线观看| 国产91免费看片| 99国产精品久久久久久久久久| 男人的天堂在线| 欧美激情精品久久久久| 国产精品久久久免费| 99sesese| 在线观看成人黄色| 一区二区视频欧美| 国产三级av在线| 日韩中文字幕第一页| 亚洲伊人网站| 美国成人av| 欧美精品在线播放| 国产a精品视频| 国产福利在线视频| 国产在线精品播放| 国产区在线观看成人精品| 色8久久影院午夜场| 成人h视频在线观看| 亚洲国产精品成人综合色在线婷婷| 欧美xxxx做受欧美护士| 国产精品美女诱惑| 福利微拍一区二区| 网曝91综合精品门事件在线| 中文字幕国产传媒| 亚洲一区二区福利| 久久97超碰国产精品超碰| 青青草在线免费视频| 国产欧美一区二区三区久久人妖| 久久欧美一区二区| 日韩成人一区| 91国在线高清视频| 亚洲国模精品一区| 99精品国产福利在线观看免费| 国产在线观看黄| 国产精品久久久久久中文字| 国产精品传媒视频| 精品国产亚洲日本| 草草草在线视频| 久久久精品久久久| 欧美激情aⅴ一区二区三区| 黄动漫网站在线观看| 国产91精品不卡视频| 亚洲成人精品一区二区| 东京久久高清| 在线播放evaelfie极品| 国产成+人+综合+亚洲欧美丁香花| 亚洲视频在线观看三级| 精品少妇3p| 神马久久高清| 国产精品美女www爽爽爽视频| 国产日本欧美一区二区| 影音先锋欧美激情| 亚洲人成色77777| 欧美在线激情网| 亚洲欧美日韩国产综合在线| 国产一区二区三区不卡视频网站| 日韩电影免费观看在| 国产精品我不卡| 欧美自拍丝袜亚洲| 亚洲一区二区久久| 免费人成在线不卡| 综合久久2019| 中文字幕日韩一区二区三区不卡 | 欧美香蕉视频| 亚洲第一精品区| 最新日韩中文字幕| 99在线精品免费| 欧洲大片精品免费永久看nba| 亚洲美免无码中文字幕在线 | 噜噜噜躁狠狠躁狠狠精品视频| 亚洲精品一线| 欧美久久电影| 久久久精品999| 亚洲免费在线看| 亚洲伦伦在线| 第一福利在线视频| 日本在线观看免费视频| 91精品国产91久久久久| 亚洲欧美一区二区不卡| 欧美日本精品| 日本理论片午伦夜理片在线观看| 欧美成人精品免费| 久久久精品国产一区二区| 亚洲国产精品自拍| 麻豆久久婷婷| 国产二区三区在线| 欧美黄网在线观看| 久久久中精品2020中文| 日本精品一区二区三区高清| 天堂在线一区二区| 国产66精品| 丁香在线视频| 亚洲色图都市激情| 欧美在线激情视频| 欧美精品日韩一区| 久久久久高潮毛片免费全部播放| 成人性爱视频在线观看| 黄色一级片黄色| 亚洲a级在线播放观看| 亚洲国产欧美一区二区丝袜黑人| 亚洲一区二区三区中文字幕在线| 国产欧美日韩电影|