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

速通 JavaScript 代理模式和發(fā)布訂閱模式

開發(fā) 前端
發(fā)布訂閱模式的優(yōu)點(diǎn)非常明顯,一為時間上的解耦,二為對象之間的解耦,但如果過度使用的話,對象和對象之間的必要聯(lián)系也將被深埋在背后,會導(dǎo)致程序難以跟蹤維護(hù)和理解。

1. 前言

JavaScript 是一門動態(tài)語言,在實(shí)現(xiàn)設(shè)計(jì)模式的時候,往往會比 Java 等靜態(tài)語言更簡便,本文將介紹在 JavaScript 中如何實(shí)現(xiàn)代理模式和發(fā)布訂閱模式。

2. 代理模式

2.1. 定義

在介紹定義時還是以類圖為主,雖然 JavaScript 實(shí)現(xiàn)設(shè)計(jì)模式時可能不會使用到類,但是類圖提供了一種通用的設(shè)計(jì)模式實(shí)現(xiàn)思想。

代理模式定義:為其他對象提供一種代理以控制對這個對象的訪問。

其類圖如下:

圖片圖片

類圖中的三個角色:

  • Subject 抽象主題角色:定義了具體主題和代理主題的共同接口,這樣在任何使用具體主題的地方都可以使用代理主題。
  • RealSubject 具體主題角色:邏輯的具體執(zhí)行者。
  • Proxy 代理主題角色:實(shí)現(xiàn)了抽象主題接口,并持有對具體主題的引用。

2.2. 實(shí)現(xiàn)

在 JavaScript 中,你可以使用 Proxy 輕松實(shí)現(xiàn)代理模式,比如可以通過代理模式實(shí)現(xiàn)一個只接收 number 類型值的數(shù)組。

const arr = []
const numArr = new Proxy(arr, {
  set(target, key, value, proxy) {
    if (typeof value !== 'number') {
      throw Error("屬性只能是 number 類型");
    }
    return Reflect.set(target, key, value, proxy);
  }
})
numArr.push(0)
numArr.push('1') // Uncaught Error: 屬性只能是 number 類型
console.log(numArr) // Proxy(Array) {0: 0}

利用 Proxy,你還可以實(shí)現(xiàn)響應(yīng)式編程。

const data = { userName: '' }

const render = (info) => {
  console.log(info)
  // 根據(jù)數(shù)據(jù)渲染界面
}

const proxyData = new Proxy(data, {
  set(target, key, value, receiver) {
    // 設(shè)置值
    Reflect.set(target, key, value, receiver)
    // 重新觸發(fā)渲染
    render(target)
  }
})

data.userName = 'xiaoming'// 控制臺輸出 { userName: 'xiaoming' }

當(dāng)然你也可以利用 Proxy 來實(shí)現(xiàn)日志功能,用于跟蹤函數(shù)調(diào)用情況。

function add(a, b) {
  return a + b;
}

// 日志記錄函數(shù)
function log(message) {
  console.log(message);
}

// 創(chuàng)建代理對象
const proxy = newProxy(add, {
// 攔截函數(shù)調(diào)用
  apply(target, thisArg, args) {
    const result = Reflect.apply(target, thisArg, args);
    log(`函數(shù) ${target.name} 被調(diào)用,參數(shù): [${args.join(', ')}],返回值: ${result}`);
    return result;
  }
});

const sum1 = proxy(1, 2);  // 輸出: 函數(shù) add 被調(diào)用,參數(shù): [1, 2],返回值: 3
const sum2 = proxy(3, 4);  // 輸出: 函數(shù) add 被調(diào)用,參數(shù): [3, 4],返回值: 7

2.3. 小結(jié)

最后提一下代理模式和裝飾模式的異同點(diǎn),兩者的共同點(diǎn)是代理類或裝飾類和原本類都具有相同的接口,不同點(diǎn)則是代理模式著重對代理過程的控制,而裝飾模式則是對類的功能進(jìn)行加強(qiáng)或減弱。

3. 發(fā)布訂閱模式

3.1. 定義

發(fā)布訂閱模式的定義:定義對象間一種一對多的依賴關(guān)系,使得每當(dāng)一個對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新。

其類圖如下:

圖片圖片

發(fā)布訂閱模式經(jīng)常會和觀察者模式做對比,兩個設(shè)計(jì)模式廣義上設(shè)計(jì)理念是一致的,在實(shí)現(xiàn)上有些差別,本文更注重實(shí)際應(yīng)用,故不展開此內(nèi)容,借用一張圖來說明。

圖片圖片

3.2. 實(shí)現(xiàn)

接著來完成發(fā)布訂閱模式的簡單實(shí)現(xiàn),主要是實(shí)現(xiàn) subscribe 和 publish 方法。

const event = { 
  listeners: [],  // 所有訂閱者集合
  // 訂閱函數(shù)
  subscribe: function(fn) { 
    this.listeners.push(fn)
  },
  // 發(fā)布函數(shù)
  publish: function() {
    for(let i = 0; i < this.listeners.length; i++) { 
      this.listeners[i]()
    } 
  },
  // 移除訂閱函數(shù)
  unsubcribe: function(fn) { 
    const fns = this.listeners;
    // 倒序訪問方便使用 splice 移除訂閱函數(shù)
    for (let l = fns.length - 1; l >=0; l--) {
      const _fn = fns[l]; 
      if (_fn === fn){ 
        fns.splice(l, 1);
      } 
    } 
  }
}

const fn1 = () => { console.log('trigger1') }
const fn2 = () => { console.log('trigger2') }
event.subscribe(fn1)
event.subscribe(fn2)
event.publish() // 控制臺打印 trigger1, trigger2
event.unsubcribe(fn1)
event.publish() // 控制臺打印 trigger2

到此我們實(shí)現(xiàn)了一個簡單版本的發(fā)布訂閱。

接下來我們基于發(fā)布訂閱模式,在 React 中實(shí)現(xiàn)一個類似 Zustand 的狀態(tài)管理功能。

首先我們需要了解一個 React 官方 Hook useSyncExternalStore,這個 Hook 可以讓你訂閱一個外部數(shù)據(jù)源,當(dāng)其中數(shù)據(jù)發(fā)生變化時,React 會觸發(fā)重新渲染。

const snapshot = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot?)

可以看到該 Hook 參數(shù)有三個,這里我們主要關(guān)注前兩個,第一個參數(shù)即訂閱函數(shù),第二個參數(shù)為獲取數(shù)據(jù)源的函數(shù),第三個和服務(wù)端渲染相關(guān)。

接下來我們要結(jié)合發(fā)布訂閱模式和 useSyncExternalStore 實(shí)現(xiàn)一個簡單版本的 Zustand。

const createImpl = (createState) => {
  // 相比發(fā)布訂閱模式,多了個狀態(tài)值
  let state
  let initialState
  const listeners = newSet()

  // 類似發(fā)布訂閱模式中的 publish 方法,最終會觸發(fā)訂閱者
  const setState = (nextState) => {    
    // 對比狀態(tài)值是否有變化
    if (!Object.is(nextState, state)) {
      const previousState = state
      state = Object.assign({}, state, nextState)
      // 觸發(fā)訂閱函數(shù)
      listeners.forEach((listener) => listener(state, previousState))
    }
  }

  const getState = () => state

  const getInitialState = () => initialState

  const subscribe = (listener) => {
    listeners.add(listener)
    // 返回一個取消訂閱的方法
    return() => {
      listeners.delete(listener)
    }
  }

  // 清空訂閱
  const destory = () => listeners.clear()

  const api = {
    setState,
    getState,
    getInitialState,
    subscribe,
    destory
  }

  // 調(diào)用 createState 方法返回初始狀態(tài)值,createState 參數(shù)為 set、get 和 api 對象
  initialState = (state = createState(setState, getState, api))

  return api
}

const create = (createState) => {
  const api = createImpl(createState)
  // 傳入訂閱方法和獲取數(shù)據(jù)方法到 useSyncExternalStore
  const useStore = () => useSyncExternalStore(api.subscribe, api.getState)
  // 把 api 合并到 Hook 上
  Object.assign(useStore, api)
  return useStore
}

exportdefault create

先來看下 createImpl 函數(shù),相比于我們實(shí)現(xiàn)的簡單版發(fā)布訂閱模式,createImpl 內(nèi)部多維護(hù)了一個狀態(tài)值,在調(diào)用發(fā)布方法(setState)時,會更新狀態(tài)值,并觸發(fā)訂閱函數(shù),訂閱函數(shù)入?yún)樾屡f狀態(tài)值。

最后我們看下如何使用自己的狀態(tài)管理功能。

// create 方法接收一個函數(shù)參數(shù),內(nèi)部會調(diào)用函數(shù)初始化狀態(tài)值,最終返回一個 Hook
const useStore = create((set) => ({
  num: 1,
  // 通過 set 方法更新狀態(tài)值,更新后觸發(fā)所有訂閱函數(shù)的調(diào)用
  random: () =>set({ num: Math.round(Math.random() * 1000) }),
}))

function Counter() {
  // 調(diào)用 useStore,useStore 會調(diào)用 React useSyncExternalStore
  const { num, random } = useStore();
  return (
    <div>
      <p>{`Number: ${num}`}</p>
      <button onClick={random}>Random</button>
    </div>
  )
}

create 方法接收一個函數(shù)參數(shù),用于初始化狀態(tài),最終 create 會返回一個 Hook。在狀態(tài)值中, random 方法會調(diào)用發(fā)布方法(setState)觸發(fā)更新,因?yàn)?nbsp;useSyncExternalStore 會使用第一個參數(shù)完成訂閱動作,所以此時它能接收到數(shù)據(jù)更新,隨后便返回最新的狀態(tài)值,并觸發(fā)重新渲染。

在線代碼示例:https://stackblitz.com/edit/react-9nvjhwhx?file=demo.tsx

至此我們實(shí)現(xiàn)了一個簡單版本 Zustand。

3.3. 小結(jié)

發(fā)布訂閱模式的優(yōu)點(diǎn)非常明顯,一為時間上的解耦,二為對象之間的解耦,但如果過度使用的話,對象和對象之間的必要聯(lián)系也將被深埋在背后,會導(dǎo)致程序難以跟蹤維護(hù)和理解。

3. 總結(jié)

設(shè)計(jì)模式大體思想是要把系統(tǒng)中不變和變化的部分分開,封裝不變的部分,根據(jù)業(yè)務(wù)靈活替換變化的部分,這樣就可以保證系統(tǒng)的健壯性和可拓展性。同時在實(shí)現(xiàn)設(shè)計(jì)模式的同時,你通常也會很好的遵守了設(shè)計(jì)模式原則,如單一職責(zé)、依賴倒置、開閉原則、迪米特原則等。

責(zé)任編輯:武曉燕 來源: 栗子前端
相關(guān)推薦

2012-02-29 09:41:14

JavaScript

2023-11-10 09:22:06

2022-06-27 13:56:10

設(shè)計(jì)模式緩存分布式系統(tǒng)

2022-12-02 07:28:58

Event訂閱模式Spring

2009-11-05 10:07:37

WCF設(shè)計(jì)模式

2012-01-13 15:59:07

2021-06-29 08:54:23

設(shè)計(jì)模式代理模式遠(yuǎn)程代理

2021-09-08 07:18:30

代理模式對象

2010-03-25 08:52:30

PHP設(shè)計(jì)模式代理模式

2011-04-06 11:41:25

Java動態(tài)代理

2024-02-26 11:52:38

代理模式設(shè)計(jì)

2024-07-29 08:34:18

C++訂閱者模式線程

2021-08-02 17:21:08

設(shè)計(jì)模式訂閱

2022-11-30 17:05:33

代碼程序場景

2024-04-10 12:27:43

Python設(shè)計(jì)模式開發(fā)

2015-09-08 13:39:10

JavaScript設(shè)計(jì)模式

2022-09-07 08:25:08

代理模式設(shè)計(jì)模式代碼

2023-12-04 08:24:23

2023-11-02 21:11:11

JavaScript設(shè)計(jì)模式

2011-03-23 10:40:51

java代理模式
點(diǎn)贊
收藏

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

日韩免费高清av| 中文字幕综合网| 日韩av免费看| 波多野结衣久久久久| 日韩中文字幕一区二区高清99| 亚洲成人av在线电影| 亚洲 国产 欧美一区| 亚洲国产精品一| 天堂va蜜桃一区二区三区漫画版| 久久韩剧网电视剧| 久久中文字幕人妻| 亚洲三级av| 欧美三级电影网| 可以在线看的av网站| 免费在线观看黄| 91麻豆国产香蕉久久精品| 91久久国产婷婷一区二区| 成人午夜视频精品一区| 亚洲有吗中文字幕| 亚洲天堂成人在线视频| 国产高潮失禁喷水爽到抽搐| 另类一区二区| 色哦色哦哦色天天综合| 日韩 欧美 视频| 午夜在线视频| 国产欧美一区二区精品久导航| 风间由美一区二区三区| 国产日产亚洲系列最新| 日韩av一级片| 日韩av手机在线看| 日本一级一片免费视频| 国内精品福利| 欧美巨猛xxxx猛交黑人97人| 激情高潮到大叫狂喷水| 欧美日韩在线二区| 亚洲欧洲激情在线| 日本xxx在线播放| 日韩av字幕| 亚洲变态欧美另类捆绑| 91av免费观看| 日日夜夜精品视频| 日韩欧美美女一区二区三区| 一级黄色大片儿| 美女视频一区| 欧美巨大另类极品videosbest | 日韩视频一区二区三区四区| 欧美色爱综合网| 男人搞女人网站| 日韩欧美一区二区三区免费观看| 欧美日韩国产色| 国模无码视频一区二区三区| 大菠萝精品导航| 亚洲国产精品精华液网站| 黄色a级片免费看| 香蕉成人app免费看片| 久久蜜桃一区二区| 欧美少妇一区| av福利在线播放| 中文字幕乱码久久午夜不卡| 一区二区三区国| 成年人网站在线| 亚洲精品欧美综合四区| 中文精品无码中文字幕无码专区 | 欧美电影免费观看高清| 中文字幕在线亚洲| 亚洲国产精品美女| 欧美 日韩 国产 激情| 东京一区二区| www.国产精品.com| 精品一区二区三区香蕉蜜桃| 国产美女被下药99| 99久久久久久久| 国产成人精品免费| 精品综合在线| 国产精品天堂| 亚洲色欲色欲www| www.欧美黄色| 男人最爱成人网| 欧美日韩国产小视频在线观看| 手机在线国产视频| 中文字幕久久精品一区二区| 日韩精品亚洲视频| 国产破处视频在线观看| 欧美精品综合| 日韩女优在线播放| 99久久国产热无码精品免费| 丁香一区二区三区| 日韩三级电影网站| 中文字幕伦理免费在线视频| 黄色成人av在线| 亚洲成人天堂网| 福利电影一区| 中文字幕亚洲第一| 日韩经典在线观看| 麻豆视频一区二区| 国产精品久久久对白| av在线免费观看网| 亚洲图片一区二区| 杨幂毛片午夜性生毛片| 国产精品久av福利在线观看| 伊人精品在线观看| 狠狠精品干练久久久无码中文字幕| 激情av在线| 欧美日韩中文字幕一区二区| 99精品一区二区三区无码吞精| 欧美日韩一区二区三区视频播放| 久久久久久国产精品三级玉女聊斋| 久久久久亚洲视频| 丁香婷婷综合五月| 一区二区三区四区视频在线 | 一本色道久久综合狠狠躁的番外| 中文字幕视频在线免费欧美日韩综合在线看| 久久久久久久久久久久国产| 蜜臀久久99精品久久久画质超高清 | 亚洲av人无码激艳猛片服务器| 丁香另类激情小说| 日韩视频在线免费播放| 精品国产欧美日韩一区二区三区| 亚洲国产高清福利视频| 中文字幕亚洲欧美日韩| 日韩av电影天堂| 麻豆久久久9性大片| 丰满的护士2在线观看高清| 91激情五月电影| 欧美做受高潮中文字幕| 亚洲情侣在线| 国产精品一区专区欧美日韩| 午夜影院免费体验区| 亚洲综合自拍偷拍| 巨乳女教师的诱惑| 亚洲精品小说| 国产欧洲精品视频| av在线播放免费| 色综合天天综合网天天看片| 国产精品嫩草av| 在线国产精品一区| 亚洲精品欧美极品| 高h视频在线观看| 欧美嫩在线观看| 2017亚洲天堂| 美日韩一级片在线观看| 亚洲国产欧美不卡在线观看| 在线一区视频观看| 在线观看国产精品日韩av| 日韩 国产 欧美| 久久日一线二线三线suv| 奇米精品一区二区三区| 欧美1区2区3区4区| 98精品国产高清在线xxxx天堂| 少妇精品高潮欲妇又嫩中文字幕 | 欧美性猛交久久久乱大交小说| 狠狠久久伊人| 538国产精品一区二区免费视频| 色哟哟中文字幕| 欧美午夜激情视频| 老牛影视av老牛影视av| 国产免费成人| 欧美日韩一区二区视频在线观看| 日韩欧美另类一区二区| 中文字幕日韩精品在线观看| 国产伦精品一区二区三区四区| 综合av第一页| 中国特级黄色片| 日韩五码在线| 日韩精品第一页| 亚洲综合视频| 欧美成人小视频| 特级丰满少妇一级aaaa爱毛片| 欧美视频不卡中文| www..com.cn蕾丝视频在线观看免费版| 奇米色一区二区三区四区| 在线观看亚洲视频啊啊啊啊| 日韩成人18| 91av中文字幕| 日本高清在线观看wwwww色| 国产精品亚洲一区二区在线观看 | 黄色国产网站在线播放| 日韩一区二区免费在线电影| 久久精品欧美一区二区| 久久久久久久久久久黄色| 性刺激的欧美三级视频| 欧美三级黄美女| 欧美人与性禽动交精品| 欧美天堂一区二区| 午夜剧场成人观在线视频免费观看| 可以在线观看的黄色| 制服丝袜亚洲精品中文字幕| 国产午夜视频在线| 国产欧美一区二区三区网站| 中文字幕第一页在线视频| 国产欧美日韩亚洲一区二区三区| 少妇免费毛片久久久久久久久| 精品国产乱码一区二区三区| 奇米四色中文综合久久| 18视频在线观看网站| 亚洲精品一区中文字幕乱码| 国产乱淫片视频| 一本色道久久综合亚洲91| 中文字幕五月天| 91蜜桃网址入口| 国产毛片久久久久久| 久久久久久久高潮| 人妻激情另类乱人伦人妻| 欧洲激情综合| 精品国产综合久久| 成人亚洲精品| 国产精品久久久久久久av电影| 日本在线视频中文有码| 在线视频免费一区二区| 天天操天天干天天舔| 91精品国产美女浴室洗澡无遮挡| 日韩美一区二区| 亚洲国产精品自拍| 免费成人深夜夜行网站| 久久精品视频在线免费观看| 国产精品成人99一区无码| 久久99精品国产麻豆不卡| 成年人视频网站免费观看| 午夜视频一区| 中文字幕第一页亚洲| 国产精品免费大片| 国内一区在线| 国产精品一线| 成人欧美一区二区三区视频| 999精品嫩草久久久久久99| 国产成人福利视频| 最近高清中文在线字幕在线观看1| 欧美激情一区二区久久久| 免费黄色在线看| 中文日韩在线观看| 国产小视频免费在线观看| 亚洲女成人图区| 日本护士...精品国| 亚洲国产精品字幕| 嫩草影院一区二区| 精品国产一区二区三区久久影院 | 又污又黄的网站| 色婷婷一区二区| 国产精品久免费的黄网站| 精品久久久国产| 欧美一二三区视频| 精品日本高清在线播放| 天堂网一区二区三区| 欧美日韩裸体免费视频| 在线观看精品国产| 欧美性猛交xxxx免费看久久久| 午夜精品久久久久久久久久久久久蜜桃 | 精品国产污网站| 黄色av网站免费在线观看| 日韩欧美一区二区免费| 亚洲国产一二三区| 精品国产乱码久久久久久1区2区 | 日本99精品| 国产精品sss| 99亚洲乱人伦aⅴ精品| 国产精品日韩一区二区| 欧美尿孔扩张虐视频| 欧美日韩国产综合视频在线| 国精一区二区| 中日韩在线视频| 欧美日韩ab| 欧美黄网站在线观看| 噜噜噜91成人网| 亚洲娇小娇小娇小| 国产成人免费视频精品含羞草妖精| 久草免费资源站| 91麻豆免费观看| 日韩精品电影一区二区三区| 亚洲日本成人在线观看| 国产亚洲欧美精品久久久久久| 午夜精品福利一区二区三区av| av在线播放天堂| 成人污版视频| 精品一区二区久久久久久久网站| 国产精品中文字幕亚洲欧美| 中文字幕99| 亚洲天堂男人| 欧美伦理视频在线观看| 国模娜娜一区二区三区| 亚洲天堂美女视频| 欧美国产日韩a欧美在线观看| 在线观看美女av| 精品国产91久久久久久老师| 中文字幕人妻一区二区在线视频 | 午夜av免费在线观看| 中日韩美女免费视频网址在线观看| a毛片在线看免费观看| 奇米一区二区三区四区久久| 日韩av懂色| 久久久www免费人成黑人精品| 久久国产影院| 黑人糟蹋人妻hd中文字幕 | www.四虎在线| 欧美激情在线一区二区| 欧美另类视频在线观看| 91久久国产综合久久| 成人福利小视频| 中文字幕免费精品一区| 激情aⅴ欧美一区二区欲海潮| 国产欧美 在线欧美| 欧美aaaaaaaa牛牛影院| 99久re热视频精品98| 丝袜美腿亚洲一区| 亚洲啪av永久无码精品放毛片 | 色999韩欧美国产综合俺来也| 国产精品三区四区| 91精品一区国产高清在线gif | 精品国产欧美| 特级西西444www大精品视频| 99国产精品99久久久久久粉嫩| 国产乱女淫av麻豆国产| 久久久久综合网| 黄色激情视频在线观看| 日韩三级视频在线看| 91大神在线网站| 日韩免费av片在线观看| 国产精品qvod| 国产性生活免费视频| 麻豆精品视频在线观看视频| 欧美熟妇一区二区| 午夜电影一区二区三区| 韩国av电影在线观看| 精品中文字幕在线| 国产色99精品9i| 超碰免费在线公开| 免费成人在线网站| 国产精品久久久久无码av色戒| 午夜久久福利影院| 理论片中文字幕| 久久久久久综合网天天| 日韩三级久久| 欧美国产视频一区| 高清视频一区二区| 九九热国产精品视频| 日韩欧美一级二级三级| 成人短视频在线观看| 亚洲字幕一区二区| 欧美一区二区| 9191在线视频| 亚洲影院久久精品| 国产综合无码一区二区色蜜蜜| 九九精品在线播放| 一区二区三区视频免费视频观看网站| 女同性恋一区二区| 国产成人免费av在线| 久艹视频在线观看| 精品奇米国产一区二区三区| 超黄网站在线观看| 久久99九九| 久久午夜精品| 男人的天堂官网 | 深夜福利视频网站| 4438全国成人免费| 国产aⅴ精品一区二区三区久久| 人妻丰满熟妇av无码区app| 国产欧美视频一区二区三区| 中文字幕永久在线观看| www高清在线视频日韩欧美| 久久天堂久久| 黄色一级视频在线播放| 91麻豆国产香蕉久久精品| 成人免费一级片| 精品国产一区久久久| 一区二区精彩视频| 熟女性饥渴一区二区三区| 国产精品三级av在线播放| 国产精品一区二区免费视频| 欧美激情精品久久久久久| 日韩精品丝袜美腿| 深夜黄色小视频| 亚洲精品久久嫩草网站秘色| 丁香花免费高清完整在线播放| 热久久99这里有精品| 99久久99久久精品国产片果冰| 91视频福利网| 欧美日韩亚洲91| 日本在线视频观看| 国产伦精品一区二区三区在线| 日本在线观看不卡视频| 免费网站观看www在线观| 亚洲男人天堂网| 国产精品一区二区三区www| 日本丰满少妇xxxx| 国产精品视频一区二区三区不卡| av在线亚洲天堂| 欧亚精品中文字幕| 亚洲一级毛片| 国产毛片久久久久久久| 6080yy午夜一二三区久久| 老司机深夜福利在线观看| 最新欧美日韩亚洲| 久久免费看少妇高潮| 99在线观看精品视频| 日本欧美一级片| 国内精品99| 国产黄a三级三级| 日韩av在线免费观看一区| 国产精品1区在线| 91最新在线观看| 婷婷丁香激情综合|