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

現(xiàn)代化Flutter架構-Riverpod數(shù)據(jù)層

開發(fā) 架構
使用Repository模式來隱藏數(shù)據(jù)層的所有實現(xiàn)細節(jié)(如 JSON 序列化)。這樣,應用程序的其余部分(領域層和表現(xiàn)層)就可以直接處理類型安全的模型類/實體。您的代碼庫也將變得更有彈性,可以抵御您所依賴的包中出現(xiàn)的破壞性變化。

設計模式是幫助我們解決軟件設計中常見問題的有用模板。

說到應用程序架構,結構設計模式可以幫助我們決定如何組織應用程序的不同部分。

在這種情況下,我們可以使用Repository模式從各種來源(如后端 API)訪問數(shù)據(jù)對象,并將它們作為類型安全的實體提供給應用程序的領域層(即我們的業(yè)務邏輯的所在層)。

在本文中,我們將詳細了解Repository Pattern:

  • 它是什么,何時使用
  • 一些實際示例
  • 使用具體類或抽象類的實現(xiàn)細節(jié)及其取舍
  • 如何使用Repository測試代碼

我還將分享一個帶有完整源代碼的天氣應用程序示例。

準備好了嗎?讓我們開始吧!

什么是Repository Pattern?

要理解這一點,讓我們來看看下面的架構圖:

圖片圖片

在這種情況下,Repository位于數(shù)據(jù)層。它們的任務是:

  • 將領域模型(或實體)與數(shù)據(jù)層中數(shù)據(jù)源的實現(xiàn)細節(jié)隔離開來。
  • 將數(shù)據(jù)傳輸對象轉換為領域層可理解的有效實體
  • (可選)執(zhí)行數(shù)據(jù)緩存等操作

?

上圖顯示的只是架構應用程序的多種可能方法之一。如果您采用不同的架構(如 MVC、MVVM 或簡潔架構),情況會有所不同,但概念是相同的。

還要注意的是,Widget屬于表現(xiàn)層,與業(yè)務邏輯或網(wǎng)絡代碼無關。

?

如果您的 widget 直接使用來自 REST API 或遠程數(shù)據(jù)庫的鍵值對,那您就做錯了。換句話說:不要將業(yè)務邏輯與用戶界面代碼混在一起。這會使你的代碼更難測試、調試和推理。

何時使用Repository Pattern?

如果您的應用程序有一個復雜的數(shù)據(jù)層,其中有許多不同的端點返回非結構化數(shù)據(jù)(如 JSON),而您希望將這些數(shù)據(jù)與應用程序的其他部分隔離開來,那么Repository Pattern就非常方便。

廣而言之,以下是我認為最適合使用Repository模式的幾種用例:

  • 與 REST API 通信
  • 與本地或遠程數(shù)據(jù)庫(如 Sembast、Hive、Firestore 等)通信
  • 與特定設備的 API(如權限、攝像頭、位置等)通信

這種方法的一大好處是,如果您使用的任何第三方應用程序接口發(fā)生重大變更,您只需更新版本庫代碼即可。

僅憑這一點,Repository就值得 100%使用。??

讓我們看看如何使用它們!??

實踐中的Repository Pattern

舉個例子,我構建了一個簡單的 Flutter 應用程序(這里是源代碼),從 OpenWeatherMap API 獲取天氣數(shù)據(jù)。

通過閱讀 API 文檔,我們可以找到如何調用 API,以及一些 JSON 格式響應數(shù)據(jù)的示例。

Repository模式非常適合抽象掉所有網(wǎng)絡和 JSON 序列化代碼。

例如,這里有一個抽象類,定義了Repository的接口:

abstract class WeatherRepository {
  Future<Weather> getWeather({required String city});
}

上述 WeatherRepository 只有一個方法,但也可以有更多方法(例如,如果您想支持所有 CRUD 操作)。

重要的是,該Repository允許我們?yōu)椋绾螜z索給定城市的天氣定義一個接口。

我們需要用一個具體類來實現(xiàn) WeatherRepository,該類可以使用網(wǎng)絡客戶端(如 http 或 dio)進行必要的 API 調用:

import 'package:http/http.dart' as http;

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  // implements the method in the abstract class
  Future<Weather> getWeather({required String city}) {
    // TODO: send request, parse response, return Weather object or throw error
  }
}

所有這些實現(xiàn)細節(jié)都與數(shù)據(jù)層有關,應用程序的其他部分不應該關心或知道這些細節(jié)。解析 JSON 數(shù)據(jù) 當然,我們還必須定義氣象模型類(或實體),以及用于解析 API 響應數(shù)據(jù)的 JSON 序列化代碼:

class Weather {
  // TODO: declare all the properties we need
  factory Weather.fromJson(Map<String, dynamic> json) {
    // TODO: parse JSON and return validated Weather object
  }
}

請注意,雖然 JSON 響應可能包含許多不同的字段,但我們只需要解析將在用戶界面中使用的字段。我們可以手動編寫 JSON 解析代碼,或者使用代碼生成包(如 Freezed)。

在應用程序中初始化Repository

一旦定義了Repository,我們就需要一種方法來初始化它,并使應用程序的其他部分可以訪問它。執(zhí)行此操作的語法會根據(jù)您選擇的 DI/狀態(tài)管理解決方案而改變。下面是一個使用 get_it 的示例:

import 'package:get_it/get_it.dart';

GetIt.instance.registerLazySingleton<WeatherRepository>(
  () => HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client(),
);

下面是另一個使用 Riverpod 軟件包中的提供程序的例子:

import 'package:flutter_riverpod/flutter_riverpod.dart';

final weatherRepositoryProvider = Provider<WeatherRepository>((ref) {
  return HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client());
});

如果你喜歡 flutter_bloc 軟件包,這里也有相應的功能:

import 'package:flutter_bloc/flutter_bloc.dart';

RepositoryProvider<WeatherRepository>(
  create: (_) => HttpWeatherRepository(api: OpenWeatherMapAPI(), client: http.Client()),
  child: MyApp(),
))

底層是一樣的:一旦初始化了Repository,就可以在應用程序的其他任何地方(Widget、模塊、Controller等)訪問它。

抽象類還是具體類?

在創(chuàng)建Repository時,一個常見的問題是:你真的需要一個抽象類嗎?這是個非常合理的問題,因為在兩個類中添加越來越多的方法可能會變得相當乏味:

abstract class WeatherRepository {
  Future<Weather> getWeather({required String city});
  Future<Forecast> getHourlyForecast({required String city});
  Future<Forecast> getDailyForecast({required String city});
  // and so on
}

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  Future<Weather> getWeather({required String city}) { ... }
  Future<Forecast> getHourlyForecast({required String city}) { ... }
  Future<Forecast> getDailyForecast({required String city}) { ... }
  // and so on
}

正如軟件設計中經(jīng)常出現(xiàn)的情況一樣,答案是:視情況而定。

因此,讓我們來看看每種方法的優(yōu)缺點。

使用抽象類

優(yōu)點:我們可以在一個地方看到Repository的接口,而不會感到雜亂無章。

優(yōu)點:我們可以將Repository換成完全不同的實現(xiàn)(例如 DioWeatherRepository 而不是 HttpWeatherRepository),只需修改一行初始化代碼,因為應用程序的其他部分只知道 WeatherRepository。

缺點:當我們 “跳轉到引用 ”時,VSCode 會有點困惑,它會把我們帶到抽象類中的方法定義,而不是具體類中的實現(xiàn)。

缺點:更多模板代碼。

只使用具體類

優(yōu)點:減少模板代碼。

優(yōu)點:“跳轉到引用 ”只適用于一個類中的Repository方法。

缺點:如果我們更改了Repository名稱,那么切換到不同的實現(xiàn)就需要進行更多更改(不過使用 VSCode 對整個項目進行重命名很容易)。

在決定使用哪種方法時,我們還應考慮如何為代碼編寫測試。

使用Repository編寫測試代碼

在測試過程中,一個常見的要求是將網(wǎng)絡代碼換成模擬代碼或 “偽代碼”,這樣我們的測試就能運行得更快、更可靠。

然而,抽象類并不能給我們帶來任何優(yōu)勢,因為在 Dart 中,所有類都有一個隱式接口。

這意味著我們可以這樣做:

// note: in Dart we can always implement a concrete class
class FakeWeatherRepository implements HttpWeatherRepository {

  // just a fake implementation that returns a value immediately
  Future<Weather> getWeather({required String city}) { 
    return Future.value(Weather(...));
  }
}

換句話說,如果我們打算在測試中模擬我們的Repository,就沒有必要創(chuàng)建抽象類。事實上,像 mocktail 這樣的包就利用了這一點,我們可以這樣使用它們:

import 'package:mocktail/mocktail.dart';

class MockWeatherRepository extends Mock implements HttpWeatherRepository {}

final mockWeatherRepository = MockWeatherRepository();
when(() => mockWeatherRepository.getWeather('London'))
          .thenAnswer((_) => Future.value(Weather(...)));

模擬數(shù)據(jù)源

在編寫測試時,可以模擬Repository并返回預制響應,就像我們上面做的那樣。但還有另一種方法,那就是模擬底層數(shù)據(jù)源。讓我們回顧一下 HttpWeatherRepository 是如何定義的:

import 'package:http/http.dart' as http;

class HttpWeatherRepository implements WeatherRepository {
  HttpWeatherRepository({required this.api, required this.client});
  // custom class defining all the API details
  final OpenWeatherMapAPI api;
  // client for making calls to the API
  final http.Client client;

  // implements the method in the abstract class
  Future<Weather> getWeather({required String city}) {
    // TODO: send request, parse response, return Weather object or throw error
  }
}

在這種情況下,我們可以選擇模擬傳遞給 HttpWeatherRepository 構造函數(shù)的 http.Client 對象。下面是一個測試示例,展示了如何做到這一點:

import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart';

class MockHttpClient extends Mock implements http.Client {}

void main() {
  test('repository with mocked http client', () async {
    // setup
    final mockHttpClient = MockHttpClient();
    final api = OpenWeatherMapAPI();
    final weatherRepository =
        HttpWeatherRepository(api: api, client: mockHttpClient);
    when(() => mockHttpClient.get(api.weather('London')))
        .thenAnswer((_) => Future.value(/* some valid http.Response */));
    // run
    final weather = await weatherRepository.getWeather(city: 'London');
    // verify
    expect(weather, Weather(...));
  });
}

最后,你可以根據(jù)要測試的內容,選擇是模擬Repository本身還是模擬底層數(shù)據(jù)源。

了解了如何測試版本庫之后,讓我們回到最初關于抽象類的問題上來。

Repository可能不需要抽象類

一般來說,如果你需要許多符合相同接口的實現(xiàn),創(chuàng)建抽象類是有意義的。

例如,在 Flutter SDK 中,StatelessWidget 和 StatefulWidget 都是抽象類,因為它們可以被子類化。

但在使用Repository時,您可能只需要一個給定Repository的實現(xiàn)。

您很可能只需要一個特定Repository的實現(xiàn),您可以將其定義為一個單一的具體類。

最小公分母

把所有東西都放在接口后面,也會使你不得不在具有不同功能的 API 之間選擇最小公分母。

也許某個 API 或后端支持實時更新,這可以用基于 Stream 的 API 來建模。

但如果您使用的是純 REST(不含 websockets),您只能發(fā)送一個請求并獲得一個響應,這最好使用基于 Future 的 API 來建模。

處理這個問題非常簡單:只需使用基于流的 API,如果使用的是 REST,則只需返回包含一個值的流即可。

但有時會存在更廣泛的 API 差異。

例如,F(xiàn)irestore 支持事務和批量寫入。這類 API 在源碼中使用了構建器模式,而這種模式不容易抽象為通用接口。

如果遷移到不同的后端,新的 API 很可能會有很大不同。換句話說,面向未來的當前應用程序接口往往不切實際,而且會適得其反。

Repository橫向擴展

隨著應用程序的增長,您可能會發(fā)現(xiàn)自己向給定的Repository中添加的方法越來越多。

如果您的后端有很大的 API 列表,或者如果您的應用程序連接到許多不同的數(shù)據(jù)源,就可能出現(xiàn)這種情況。

在這種情況下,可以考慮創(chuàng)建多個Repository,將相關的方法放在一起。例如,如果您正在構建一個電子商務應用程序,您可以為產(chǎn)品列表、購物車、訂單管理、身份驗證、結賬等創(chuàng)建單獨的Repository。

保持簡單

與往常一樣,保持簡單總是個好主意。因此,不要對應用程序接口想得太多。

您可以根據(jù)您需要使用的 API 來構建您的版本庫接口模型,然后就可以收工了。如果需要,您可以隨時重構。??

結論

如果我想讓你從這篇文章中得到什么啟發(fā),那就是:使用Repository模式來隱藏你的代碼:

使用Repository模式來隱藏數(shù)據(jù)層的所有實現(xiàn)細節(jié)(如 JSON 序列化)。這樣,應用程序的其余部分(領域層和表現(xiàn)層)就可以直接處理類型安全的模型類/實體。您的代碼庫也將變得更有彈性,可以抵御您所依賴的包中出現(xiàn)的破壞性變化。

如果說有什么收獲的話,我希望這篇概述能鼓勵您更清晰地思考應用程序架構,以及擁有邊界清晰的獨立表現(xiàn)層、應用層、領域層和數(shù)據(jù)層的重要性。

本文翻譯自:https://codewithandrea.com/articles/flutter-repository-pattern/

責任編輯:武曉燕 來源: 群英傳
相關推薦

2023-02-08 11:07:56

數(shù)字時代數(shù)字運營模式

2023-06-25 09:04:12

數(shù)字企業(yè)架構EA

2025-08-08 07:18:00

CIOIT架構IT服務管理

2020-08-05 07:00:00

數(shù)據(jù)架構工具技術

2021-04-13 16:13:38

大數(shù)據(jù)教育科學

2024-01-23 15:21:14

2013-03-22 10:27:40

企業(yè)再現(xiàn)代化IBM論壇2013

2022-07-26 06:57:07

數(shù)據(jù)管道端點API

2018-06-05 13:43:49

數(shù)據(jù)基礎設施

2022-07-11 05:34:19

云原生應用程序

2015-10-29 14:35:21

移動設備現(xiàn)代化

2019-08-30 08:23:47

基礎架構IT架構數(shù)據(jù)備份

2017-11-06 14:48:01

大數(shù)據(jù)法醫(yī)犯罪

2015-12-24 10:33:31

數(shù)據(jù)中心現(xiàn)代數(shù)據(jù)中心

2025-10-10 08:00:00

2017-11-23 05:50:14

2023-08-18 08:07:37

2020-06-05 14:16:05

醫(yī)藥
點贊
收藏

51CTO技術棧公眾號

国产福利资源在线| 91杏吧porn蝌蚪| 国产成人精品一区二区三区免费| 国产日韩欧美高清在线| 成人欧美一区二区三区黑人孕妇 | 北岛玲一区二区三区四区| 91高清视频免费| 欧美一区二区三区观看| 超碰精品在线| 欧美日韩1区2区| 丰满少妇大力进入| 91社区在线| av在线不卡电影| 国产欧美婷婷中文| 精品91久久久| 久久精品影视| 亚洲区中文字幕| 亚洲 自拍 另类 欧美 丝袜| 亚洲第一影院| 天天操天天干天天综合网| 亚洲午夜精品一区二区三区| 日韩在线一区二区三区四区| 精品一区二区久久久| 欧美一级在线播放| 欧美日韩在线视频免费| 欧美日韩中字| 国产午夜精品理论片a级探花| 伦伦影院午夜理论片| 日韩经典一区| 日韩欧美中文在线| 国产精品久久久久久久乖乖| 精品欧美色视频网站在线观看| 久久久久久久久久久久久久久99 | 午夜影院在线视频| 国产aⅴ精品一区二区三区色成熟| 国产精品美乳在线观看| 欧美三级韩国三级日本三斤在线观看| 一个色综合网| 久久久国产精品免费| 精品无码在线观看| 激情五月色综合国产精品| 精品国产sm最大网站| 亚洲av毛片在线观看| 国产成人免费精品| 在线看不卡av| 91国产精品视频在线观看| xx欧美视频| 精品久久久久久国产| 隔壁人妻偷人bd中字| 宅男在线观看免费高清网站| 国产精品久99| 伊人色综合影院| 在线观看黄av| 中文字幕日韩一区| 精品久久免费观看| 18av在线播放| 洋洋成人永久网站入口| 久久亚洲国产成人精品无码区| 成人区精品一区二区不卡| 1区2区3区欧美| 国产又粗又爽又黄的视频| а天堂中文在线官网| 亚洲乱码国产乱码精品精98午夜| 强伦女教师2:伦理在线观看| 黄网页免费在线观看| 国产精品亲子伦对白| 伊人久久99| 欧美xxxx少妇| 欧美日韩一区免费| 妓院一钑片免看黄大片| 欧美成人三级| 日韩午夜小视频| 人妻 丝袜美腿 中文字幕| 精品欧美午夜寂寞影院| 日韩精品极品视频免费观看| 欧洲美一区二区三区亚洲 | 免费看污污视频| 天堂8中文在线| 精品久久久久久久久中文字幕| av7777777| 国产毛片精品久久| 欧美大片一区二区三区| 中文字幕无码人妻少妇免费| 国产欧美日韩免费观看| 久久精品电影一区二区| 久艹视频在线观看| 久久久久在线| 91美女片黄在线观看游戏| 男人天堂综合网| 国产欧美日韩综合精品一区二区| 国产美女视频免费| 日本在线啊啊| 制服丝袜在线91| 999精品免费视频| 大片网站久久| 欧美精品videossex性护士| 亚洲欧美日韩激情| 国产精品资源在线看| 欧美成人dvd在线视频| 免费大片在线观看www| 午夜视频一区二区| 中文字幕免费高清在线| 美国成人xxx| 久久久精品电影| 久久久久久久亚洲| 成人av免费在线观看| 一区二区三区三区在线| 色在线视频观看| 日韩欧美国产一区二区三区 | 国产成人精品电影| 性做久久久久久久久久| 国产精品全国免费观看高清| 国产免费观看高清视频| 国产精久久一区二区| 亚洲欧美国内爽妇网| 久草视频免费在线| 精品无码三级在线观看视频| 欧美日韩一区二区三区在线观看免| 成人av黄色| 欧美亚洲图片小说| 亚洲黄色免费在线观看| 午夜国产一区| 成人两性免费视频| 国产高清视频免费最新在线| 婷婷六月综合亚洲| 国内自拍偷拍视频| 欧美一区91| 成人黄色激情网| av片在线免费观看| 在线免费观看日本一区| 狠狠人妻久久久久久综合蜜桃| 欧美一区激情| 成人午夜高潮视频| av电影在线观看| 色哟哟一区二区三区| 无码成人精品区在线观看| 午夜电影亚洲| www.成人av.com| 黄色在线观看网站| 欧美日韩一区三区四区| аⅴ天堂中文在线网| 久久免费黄色| 欧美日韩综合网| 国产精品专区免费| 亚洲欧美日韩直播| 无码免费一区二区三区| 久久久亚洲午夜电影| 久久精品99国产| 美女少妇全过程你懂的久久| 欧美综合第一页| 欧美偷拍视频| 色悠久久久久综合欧美99| 一区二区精品免费| 日产国产高清一区二区三区| 亚洲午夜激情av| 蜜桃传媒视频第一区入口在线看| av影院在线免费观看| 亚洲国产精品美女| 成人在线免费看视频| av在线不卡一区| 在线免费看黄色片| 激情亚洲成人| 精品无人区一区二区三区竹菊| 成人免费网站观看| 亚洲欧美在线一区二区| 国产无遮挡又黄又爽又色视频| 国产欧美日韩激情| 精品日韩久久久| 小说区亚洲自拍另类图片专区| 亚洲精品免费一区二区三区| 乱插在线www| 日韩黄色在线免费观看| 夜夜躁日日躁狠狠久久av| 国产精品系列在线| 色黄视频免费看| 99国产精品私拍| 日韩欧美激情一区二区| 欧美天堂在线| 久久久久久久久中文字幕| 日韩三级电影网| 欧美日产在线观看| 久久精品国产亚洲av高清色欲| 91亚洲精品久久久蜜桃| 杨幂毛片午夜性生毛片| 欧美视频福利| 欧美重口乱码一区二区| 国产精品一区二区三区av| 久久人人爽人人| eeuss影院在线播放| 日韩一区二区三区在线视频| 日韩精品在线免费视频| 成人免费在线播放视频| 中文字幕影片免费在线观看| 久久电影网站中文字幕| 成人免费性视频| 日本一区二区免费高清| 国产伦精品一区二区三区在线| 小黄鸭精品aⅴ导航网站入口| 久久综合伊人77777尤物| 丝袜视频国产在线播放| 91麻豆精品国产91久久久久| 天码人妻一区二区三区在线看| 最新国产の精品合集bt伙计| 国产白嫩美女无套久久| 国产在线一区二区综合免费视频| 欧美日韩精品在线一区二区 | 亚洲成人av片在线观看| 中文字幕一区二区三区人妻四季| 亚洲一卡二卡三卡四卡无卡久久| 少妇精品无码一区二区免费视频| 国产成人午夜电影网| 冲田杏梨av在线| 国产视频欧美| 奇米777四色影视在线看| 成人影院在线| 免费中文日韩| 开心激情综合| 99porn视频在线| 综合欧美精品| 国产精品欧美激情| 国产欧美一区二区三区精品酒店| 欧美老少做受xxxx高潮| 欧美人xxx| 尤物yw午夜国产精品视频| 性猛交xxxx| 亚洲第一免费网站| 亚洲精品.www| 日韩区在线观看| 国产女人高潮毛片| 欧美日韩大陆一区二区| 亚洲 小说区 图片区| 欧美日韩中文字幕在线视频| 永久免费看片在线播放| 亚洲一区二区三区不卡国产欧美| 青青草手机在线视频| 亚洲女同一区二区| 欧美风情第一页| 国产精品久久精品日日| 亚洲精品电影院| 国产精品久久久久影院亚瑟| 91视频免费在观看| 国产日韩欧美高清| 国产无遮挡在线观看| 欧美激情综合网| 波多野结衣家庭教师在线观看| 日本一区二区成人| 国产三级黄色片| 国产精品天干天干在观线| 18精品爽国产三级网站| www视频在线观看免费| 亚洲国产视频一区二区| 久草免费新视频| 亚洲成人tv网| 毛片在线免费视频| 91福利国产成人精品照片| 国产女主播喷水视频在线观看| 色哟哟精品一区| 日韩欧美国产另类| 欧美男生操女生| 亚洲AV午夜精品| 亚洲国内精品在线| 欧美精品少妇| 色999日韩欧美国产| gogogogo高清视频在线| 久久久天堂国产精品女人| 韩国精品一区| 国产精品第七十二页| 久久精品超碰| av一区二区三区免费| 羞羞答答一区二区| 亚洲精蜜桃久在线| 一区二区不卡| 亚洲人精品午夜射精日韩| 天堂影院一区二区| www.久久久久久久久久久| 国产成人精品免费视频网站| 真人bbbbbbbbb毛片| 欧美激情一区二区| 午夜少妇久久久久久久久| 午夜精品福利一区二区三区av| 天天爽夜夜爽夜夜爽精品| 欧美日韩中字一区| 午夜老司机福利| 亚洲男人的天堂在线| 免费观看在线午夜影视| 91精品国产高清久久久久久91| 成人啊v在线| 2019国产精品视频| 在线亚洲a色| 成人免费a级片| 日韩二区三区四区| 久久久无码人妻精品无码| 国产午夜精品一区二区三区嫩草 | 亚洲伊人av| 国产欧美日韩中文字幕在线| 久久精品亚洲成在人线av网址| 日本一区二区三不卡| 欧美不卡高清| 一区二区在线播放视频| 国产91精品一区二区麻豆亚洲| 六月婷婷七月丁香| 亚洲尤物在线视频观看| 自拍偷拍色综合| 亚洲电影免费观看高清| 日本在线观看| 欧美一区二区大胆人体摄影专业网站| 欧美国产视频| 日本一区二区不卡高清更新| 在线国产日韩| 成人高清在线观看视频| 国产亚洲综合性久久久影院| 国产在线观看成人| 欧美福利视频导航| 成年人视频在线观看免费| 久久久久亚洲精品国产 | 久久国产欧美精品| 欧美激情麻豆| 在线观看免费的av| 国产视频一区二区在线观看| 日韩成人免费在线观看| 欧美一级高清片在线观看| 最新97超碰在线| 国产成人精品免费久久久久 | 国产一区二区三区影视| 久久66热这里只有精品| 黄色av日韩| 欧美一级大片免费看| 最新国产の精品合集bt伙计| 一区二区视频免费| 中文字幕精品在线| 四虎影视4hu4虎成人| 欧美久久电影| 亚洲综合日本| 37p粉嫩大胆色噜噜噜| 激情成人中文字幕| 亚洲精品国产av| 久久久亚洲国产| 91精品国产自产在线丝袜啪| 女女百合国产免费网站| 国产主播一区二区三区| 黄色香蕉视频在线观看| 337p亚洲精品色噜噜| 午夜视频在线观看网站| 国产日韩综合一区二区性色av| 日韩欧美在线中字| 激情视频免费网站| 国产精品欧美一区二区三区| 亚洲图片视频小说| 久久精彩免费视频| 国产精品国产三级在线观看| 一区二区三区四区视频在线观看| 麻豆国产精品一区二区三区 | 欧美破处大片在线视频| 永久看看免费大片| 亚洲一区二区在线免费观看视频| 国产黄色一级大片| 欧美激情亚洲激情| 露出调教综合另类| 成人三级视频在线播放| 中文字幕第一区二区| 91精品国产乱码久久久久| 久久久精品久久久| 超碰地址久久| 国产熟女高潮视频| 国产精品美女视频| 国产高清不卡视频| 午夜精品在线视频| 国产精品欧美在线观看| 日本高清久久久| 一区二区三区日韩欧美| 污视频在线免费| 国产精品久久网| 亚洲深深色噜噜狠狠爱网站| www.555国产精品免费| 色域天天综合网| 黄色网页在线看| 国产亚洲二区| 蜜乳av一区二区三区| 免费视频一二三区| 亚洲欧美在线免费| 国产精品美女久久久久人| 国产资源在线视频| 国产精品人人做人人爽人人添| 亚洲AV午夜精品| 国产精品18久久久久久麻辣| 天天做天天爱天天综合网2021| 9.1在线观看免费| 在线观看亚洲精品| 亚洲婷婷噜噜| 日本在线观看一区| 国v精品久久久网| 欧美男人天堂网| 国内精品一区二区三区| 不卡在线一区| 国产精品扒开腿做爽爽爽a片唱戏| 欧美无砖砖区免费| 17videosex性欧美| 亚洲小说欧美另类激情| 国产亚洲欧美日韩在线一区| 性中国xxx极品hd|