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

DDD實(shí)戰(zhàn)篇:分層架構(gòu)的代碼結(jié)構(gòu)

開發(fā) 架構(gòu) 開發(fā)工具
不同于其它的架構(gòu)方法,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD(Domain Driven Design)提出了從業(yè)務(wù)設(shè)計(jì)到代碼實(shí)現(xiàn)一致性的要求,不再對分析模型和實(shí)現(xiàn)模型進(jìn)行區(qū)分。也就是說從代碼的結(jié)構(gòu)中我們可以直接理解業(yè)務(wù)的設(shè)計(jì),命名得當(dāng)?shù)脑?,非程序人員也可以“讀”代碼。

不同于其它的架構(gòu)方法,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)DDD(Domain Driven Design)提出了從業(yè)務(wù)設(shè)計(jì)到代碼實(shí)現(xiàn)一致性的要求,不再對分析模型和實(shí)現(xiàn)模型進(jìn)行區(qū)分。也就是說從代碼的結(jié)構(gòu)中我們可以直接理解業(yè)務(wù)的設(shè)計(jì),命名得當(dāng)?shù)脑?,非程序人員也可以“讀”代碼。

[[209114]]

然而在整個(gè)DDD的建模過程中,我們更多關(guān)注的是核心領(lǐng)域模型的建立,我們認(rèn)為完成業(yè)務(wù)的需求就是在領(lǐng)域模型上的一系列操作(應(yīng)用)。這些操作包括了對核心實(shí)體狀態(tài)的改變,領(lǐng)域事件的存儲(chǔ),領(lǐng)域服務(wù)的調(diào)用等。在良好的領(lǐng)域模型之上,實(shí)現(xiàn)這些應(yīng)用應(yīng)該是輕松而愉快的。

筆者經(jīng)歷過很多次DDD的建模工作坊,在經(jīng)歷了數(shù)天一輪又一輪激烈討論和不厭其煩的審視之后,大家欣慰地看著白板上各種顏色紙貼所展示出來的領(lǐng)域模型,成就感寫滿大家的臉龐。就在這個(gè)大功告成的時(shí)刻,往往會(huì)有人問:這個(gè)模型我們怎么落地呢?然后大家臉上的愉悅消失了,換上了對細(xì)節(jié)就是魔鬼的焦慮。但這是我們不可避免的實(shí)現(xiàn)細(xì)節(jié),DDD的原始方法論中雖然給出了“分層架構(gòu)”(Layered Architecture)的元模型,但如何分層卻沒有明確定義。

分層架構(gòu)

在DDD方法提出后的數(shù)年里,分層架構(gòu)的具體實(shí)現(xiàn)也經(jīng)歷了幾代演進(jìn),直到Martin Fowler提煉出下圖的分層實(shí)現(xiàn)架構(gòu)后,才逐步為大家所認(rèn)可。DDD的方法也得到了有效的補(bǔ)充,模型落地的問題也變得更容易,核心領(lǐng)域模型的范圍也做出了比較明確的定義:包括了Domain,Service Layer和Repositories。

DDD實(shí)戰(zhàn)篇:分層架構(gòu)的代碼結(jié)構(gòu)

(Martin Fowler總結(jié)提出的分層架構(gòu)實(shí)現(xiàn),注意“Resources”是基于RESTful架構(gòu)的抽象,我們也可以理解為更通用的針對外界的接口Interface。而HTTP Client主要是針對互聯(lián)網(wǎng)的通信協(xié)議,Gateways實(shí)際才是交換過程中組裝信息的邏輯所在。)

我們的核心實(shí)體(Entity)和值對象(Value Object)應(yīng)該在Domain層,定義的領(lǐng)域服務(wù)(Domain Service)在Service Layer,而針對實(shí)體和值對象的存儲(chǔ)和查詢邏輯都應(yīng)該在Repositories層。值得注意的是,不要把Entity的屬性和行為分離到Domain和Service兩層中去實(shí)現(xiàn),即所謂的貧血模型,事實(shí)證明這樣的實(shí)現(xiàn)方式會(huì)造成很大的維護(hù)問題。DDD戰(zhàn)術(shù)建模中的元模型定義不應(yīng)該在實(shí)現(xiàn)過程中被改變,作為元模型中元素之一的實(shí)體本身就應(yīng)該包含針對自身的行為定義。

基于這個(gè)模型,下面我們來談?wù)劯唧w的代碼結(jié)構(gòu)。對于這個(gè)分層架構(gòu)還有疑惑的讀者可以精讀一下Martin的 原文 。有意思的一點(diǎn)是,這個(gè)模型的敘述實(shí)際是在微服務(wù)架構(gòu)的測試文章中,其中深意值得大家體會(huì)。

這里需要明確的是,我們談?wù)摯a結(jié)構(gòu)的時(shí)候,針對的是一個(gè)經(jīng)過DDD建模后的子問題域(參見戰(zhàn)略設(shè)計(jì)篇),這是我們明確的組件化邊界。是否進(jìn)一步組件化,比如按照限界上下文(Bounded Context)模塊化,或采用微服務(wù)架構(gòu)服務(wù)化,核心實(shí)體都是進(jìn)一步可能采用的組件化方法。從抽象層面講,老馬提煉的分層架構(gòu)適用于面向業(yè)務(wù)的服務(wù)化架構(gòu),所以如果要進(jìn)一步組件化也是可以按照這個(gè)代碼結(jié)構(gòu)來完成的。

總體的代碼目錄結(jié)構(gòu)如下:

 

  1. - DDD-Sample/src/ 
  2.     domain 
  3.     gateways 
  4.     interface 
  5.     repositories 
  6.     services 

這個(gè)目錄結(jié)構(gòu)一一對應(yīng)了前文的分層架構(gòu)圖。完整的案例代碼請從GitHub 下載 。

可以看到實(shí)際上我們并沒有建立外部存儲(chǔ)(Data Mappers/ORM)和對外通信(HTTP Client)的目錄。從領(lǐng)域模型和應(yīng)用的角度,這兩者都是我們不必關(guān)心的,能夠驗(yàn)證整個(gè)領(lǐng)域模型的輸入和輸出就足夠了。至于什么樣的外部存儲(chǔ)和外部通信機(jī)制是可以被“注入”的。這樣的隔離是實(shí)現(xiàn)可獨(dú)立部署服務(wù)的基礎(chǔ),也是我們能夠測試領(lǐng)域模型實(shí)現(xiàn)的要求。

[[209115]]

模型表達(dá)

根據(jù)分層架構(gòu)確立了代碼結(jié)構(gòu)后,我們需要首先定義清楚我們的模型。如前面講到的,這里主要涉及的是從戰(zhàn)術(shù)建模過程中得到的核心實(shí)體和服務(wù)的定義。我們利用C++頭文件(.h文件)來展示一個(gè)Domain模型的定義,案例靈感來源于DDD原著里的集裝箱貨運(yùn)例子。

 

  1. namespace domain{ 
  2. struct Entity 
  3.     int getId(); 
  4. protected: 
  5.     int id; 
  6. }; 
  7.  
  8. struct AggregateRoot: Entity 
  9. }; 
  10.  
  11. struct ValueObject 
  12. }; 
  13.  
  14. struct Provider 
  15.  
  16. }; 
  17.  
  18. struct Delivery: ValueObject 
  19.     Delivery(int); 
  20.     int AfterDays; 
  21. }; 
  22.  
  23. struct Cargo: AggregateRoot 
  24.     Cargo(Delivery*, int); 
  25.     ~Cargo(); 
  26.     void Delay(int); 
  27. private: 
  28.     Delivery* delivery; 
  29. }; 

這個(gè)實(shí)現(xiàn)首先申明了元模型實(shí)體Entity和值對象ValueObject。實(shí)體一定會(huì)有一個(gè)標(biāo)識(shí)id。在實(shí)體的基礎(chǔ)上聲明了DDD中的重要元素聚合根 AggregateRoot。根據(jù)定義,聚合根本身就應(yīng)該是一個(gè)實(shí)體,所以AggregateRoot繼承了Entity。

這個(gè)案例中我們定義了一個(gè)實(shí)體Cargo,同時(shí)也是一個(gè)聚合根。Delivery是一個(gè)值對象。雖然這里為了實(shí)現(xiàn)效率采用的是struct,在C++里可以理解為定義一個(gè)class類。

依賴關(guān)系

代碼目錄結(jié)構(gòu)并不能表達(dá)分層體系中各層的依賴關(guān)系,比如Domain層是不應(yīng)該依賴于其它任何一層的。維護(hù)各層的依賴關(guān)系是至關(guān)重要的,很多團(tuán)隊(duì)在實(shí)施的過程中都沒有能夠建立起這樣的工程紀(jì)律,最后造成代碼結(jié)構(gòu)的混亂,領(lǐng)域模型也被打破。

根據(jù)分層架構(gòu)的規(guī)則,我們可以看到示例中的代碼結(jié)構(gòu)如下圖。

DDD實(shí)戰(zhàn)篇:分層架構(gòu)的代碼結(jié)構(gòu)

Domain是不依賴于任何的其它對象的。Repositories是依賴于Domain的,實(shí)現(xiàn)如下:引用了model.h。

 

  1. #include "model.h" 
  2. #include <vector> 
  3.  
  4. using namespace domain; 
  5.  
  6. namespace repositories { 
  7. struct Repository 
  8. }; 
  9. ... 

Services是依賴于Domain和Repositories的,實(shí)現(xiàn)如下:引用了model.h和repository.h

 

  1. #include "model.h" 
  2. #include "repository.h" 
  3.  
  4. using namespace domain; 
  5. using namespace repositories; 
  6.  
  7. namespace services { 
  8. struct CargoProvider : Provider { 
  9.     virtual void Confirm(Cargo* cargo){}; 
  10. }; 
  11.  
  12. struct CargoService { 
  13.     ... ... 
  14. }; 
  15. ... 

為了維護(hù)合理的依賴關(guān)系,依賴注入(Depedency Injection)是需要經(jīng)常采用的實(shí)現(xiàn)模式,它作為解耦合的一種方法相信大家都不會(huì)陌生,具體定義參見 這里 。

在測試構(gòu)建時(shí),我們利用了一個(gè)IoC框架(依賴注入的實(shí)現(xiàn))來構(gòu)造了一個(gè)Api,并且把相關(guān)的依賴(如CargoService)注入給了這個(gè)Api。這樣既沒有破壞Interface和Service的單向依賴關(guān)系,又解決了測試過程中Api的實(shí)例化要求。

 

  1. auto provider = std::make_shared< StubCargoProvider >(); 
  2.  
  3. api::Api* createApi()  { 
  4.     ContainerBuilder builder; 
  5.     builder.registerType< CargoRepository >().singleInstance(); 
  6.     builder.registerInstance(provider).as<CargoProvider>(); 
  7.     builder.registerType< CargoService >().singleInstance(); 
  8.     builder.registerType<api::Api>().singleInstance(); 
  9.  
  10.     auto container = builder.build(); 
  11.  
  12.     std::shared_ptr<api::Api> api = container->resolve<api::Api>(); 
  13.  
  14.     return api.get(); 

測試實(shí)現(xiàn)

有了領(lǐng)域模型,大家自然會(huì)想著如何去實(shí)現(xiàn)業(yè)務(wù)應(yīng)用了,而實(shí)現(xiàn)應(yīng)用的過程中一定會(huì)考慮到單元測試的設(shè)計(jì)。在構(gòu)建高質(zhì)量軟件過程中,單元測試已經(jīng)成為了標(biāo)準(zhǔn)規(guī)范,但高質(zhì)量的單元測試卻是困擾很多團(tuán)隊(duì)的普遍問題。很多時(shí)候設(shè)計(jì)測試比實(shí)現(xiàn)應(yīng)用本身更加困難。

這里很難有一個(gè)固定標(biāo)準(zhǔn)來評(píng)判某個(gè)時(shí)間點(diǎn)的單元測試質(zhì)量,但一個(gè)核心的原則是讓用例盡量測試業(yè)務(wù)需求而不是實(shí)現(xiàn)方式本身。滿足業(yè)務(wù)需求是我們的目標(biāo),實(shí)現(xiàn)方式可能有多種,我們不希望需要持續(xù)重構(gòu)的實(shí)現(xiàn)代碼影響到我們的測試用例。比如針對實(shí)現(xiàn)過程中的某個(gè)函數(shù)進(jìn)行入?yún)⒑统鰠⒌膯卧獪y試,當(dāng)這個(gè)函數(shù)發(fā)生一點(diǎn)改變(即使是重命名),我們也需要改動(dòng)測試。

[[209116]]

測試驅(qū)動(dòng)開發(fā)TDD無疑是一種好的實(shí)踐,如果應(yīng)用得當(dāng),它確實(shí)能夠?qū)崿F(xiàn)我們上述的原則,并且能夠幫助我們交流業(yè)務(wù)的需求。比較有意思的是,在基于DDD建立的核心模型之上應(yīng)用TDD似乎更加順理成章。類比DDD和TDD雖然是不恰當(dāng)?shù)?,但我們?huì)發(fā)現(xiàn)兩者在遵循的原則上是一致的,即都是面向業(yè)務(wù)做分解和設(shè)計(jì):DDD就整個(gè)業(yè)務(wù)問題域進(jìn)行了分解,形成子問題域;TDD就業(yè)務(wù)需求在實(shí)現(xiàn)時(shí)進(jìn)行任務(wù)分解,從簡單場景到復(fù)雜場景逐步通過測試驅(qū)動(dòng)出實(shí)現(xiàn)。下面的測試用例展現(xiàn)了在核心模型上的TDD過程。

 

  1. TEST(bc_demo_test, create_cargo) 
  2.     api::CreateCargoMsg* msg = new api::CreateCargoMsg(); 
  3.     msg->Id = ID; 
  4.     msg->AfterDays = AFTER_DAYS; 
  5.     createCargo(msg); 
  6.     EXPECT_EQ(msg->Id, provider->cargo_id); 
  7.     EXPECT_EQ(msg->AfterDays, provider->after_days); 

上面測試了收到一條創(chuàng)建信息后實(shí)例化一個(gè)Cargo的簡單場景,要求創(chuàng)建后的Cargo的標(biāo)識(shí)id跟信息里的一致,并且出貨的日期一致。這個(gè)測試驅(qū)動(dòng)出來一個(gè)Interface的Api::CreateCargo。

下面是另外一個(gè)測試推遲delay的場景,同樣我們看到了驅(qū)動(dòng)出的Api::Delay的實(shí)現(xiàn)。

 

  1. TEST(bc_demo_test, delay_cargo) 
  2.     api::Api* api = createApi(); 
  3.     api::CreateCargoMsg* msg = new api::CreateCargoMsg(); 
  4.     msg->Id = ID; 
  5.     msg->AfterDays = AFTER_DAYS; 
  6.     api->CreateCargo(msg); 
  7.     api->Delay(ID,2); 
  8.     EXPECT_EQ(ID, provider->cargo_id); 
  9.     EXPECT_EQ(12, provider->after_days); 

長期以來對于TDD這個(gè)實(shí)踐大家都有架構(gòu)設(shè)計(jì)上的疑惑,很多資深架構(gòu)師擔(dān)心完全從業(yè)務(wù)需求驅(qū)動(dòng)出實(shí)現(xiàn)沒法形成有效的技術(shù)架構(gòu),而且每次實(shí)現(xiàn)的重構(gòu)成本都可能很高。DDD的引入從某種程度上解決了這個(gè)顧慮,通過前期的戰(zhàn)略和戰(zhàn)術(shù)建模確定了核心領(lǐng)域架構(gòu),這個(gè)架構(gòu)是通過預(yù)先綜合討論決策的,考慮了更廣闊的業(yè)務(wù)問題,較之TDD應(yīng)用的業(yè)務(wù)需求層面更加宏觀。在已有核心模型基礎(chǔ)上我們也會(huì)發(fā)現(xiàn)測試用例的設(shè)計(jì)更容易從應(yīng)用視角出發(fā),從而降低了測試設(shè)計(jì)的難度。

關(guān)于預(yù)先設(shè)計(jì)

如果沒有讀戰(zhàn)略篇直接看本文的讀者肯定會(huì)提出關(guān)于預(yù)先設(shè)計(jì)的顧慮,畢竟DDD是被敏捷開發(fā)圈子認(rèn)可的一種架構(gòu)方式,其目標(biāo)應(yīng)該是構(gòu)建架構(gòu)模型的響應(yīng)力。而這里給大家的更多是模式化的實(shí)現(xiàn)過程,好似從建模到代碼一切都預(yù)先設(shè)計(jì)好了。

值得強(qiáng)調(diào)的是,我們?nèi)匀环磳η捌谠O(shè)計(jì)的大而全(Big-Design-Up-Front,BDUF)。 但我們應(yīng)該認(rèn)可前期對核心領(lǐng)域模型的分析和設(shè)計(jì),這樣能夠幫助我們更快地響應(yīng)后續(xù)的業(yè)務(wù)變化(即在核心模型之上的應(yīng)用)。這不代表著核心領(lǐng)域模型未來會(huì)一成不變,或者不能改變,而是經(jīng)過統(tǒng)一建模的核心部分變化頻率較之外部應(yīng)用會(huì)低很多。如果核心領(lǐng)域模型也變化劇烈,那么我們可能就要考慮是否業(yè)務(wù)發(fā)生了根本性的變化,需要建立新的模型。

另外不能忘記我們預(yù)先定義的模型也是被局限在一個(gè)分解出來的核心問題域里的,也就是說我們并不希望一口氣把整個(gè)復(fù)雜的業(yè)務(wù)領(lǐng)域里的所有模型都建立起來。這種范圍的局限某種程度上也限制了我們預(yù)先設(shè)計(jì)的范圍,促使我們更多用迭代的方式來看待建模工作本身。

最后顯然我們應(yīng)該有一個(gè)核心團(tuán)隊(duì)來守護(hù)核心領(lǐng)域模型,這不代表著任何模型的設(shè)計(jì)和改動(dòng)都必須由這個(gè)團(tuán)隊(duì)的人做出(雖然有不少的團(tuán)隊(duì)確實(shí)是這樣落地DDD的)。我們期望的是任何對核心模型的改動(dòng)都能夠通過這個(gè)核心團(tuán)隊(duì)來促進(jìn)更大范圍的交流和溝通。檢驗(yàn)一個(gè)模型是否落地的唯一標(biāo)準(zhǔn)是應(yīng)用這個(gè)模型的團(tuán)隊(duì)能否就模型本身達(dá)成共識(shí)。在這點(diǎn)上我們看到很多團(tuán)隊(duì)持續(xù)通過代碼走查(code review)的方式在線上和線下實(shí)踐基于核心模型的交流,從而起到了真正意義上的“守護(hù)”作用,讓模型本身成為團(tuán)隊(duì)的共同責(zé)任。

實(shí)踐DDD時(shí)仍然需要遵循“模型是用來交流的”的這一核心原則。我們希望本文介紹的方法及模式能夠幫助大家更容易地交流領(lǐng)域模型,也算是對DDD戰(zhàn)略和戰(zhàn)術(shù)設(shè)計(jì)的一點(diǎn)補(bǔ)充。

【本文是51CTO專欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號(hào):思特沃克,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:未麗燕 來源: ThoughtWorks洞見
相關(guān)推薦

2022-04-07 07:51:40

代碼結(jié)構(gòu)設(shè)計(jì)

2009-06-15 16:05:30

設(shè)計(jì)AnnotatioJava

2024-05-31 12:59:03

2019-05-21 14:33:01

2021-07-02 10:10:55

SecurityJWT系統(tǒng)

2018-05-08 18:26:49

數(shù)據(jù)庫MySQL性能

2025-01-15 08:46:55

2021-07-05 08:41:49

RedisGEO系統(tǒng)

2016-12-09 13:45:21

RNN大數(shù)據(jù)深度學(xué)習(xí)

2010-11-09 10:03:26

2023-02-23 10:03:57

2017-11-06 08:28:44

DDD架構(gòu)設(shè)計(jì)IT

2021-04-29 09:40:32

測試IDEAirtest

2023-02-23 10:11:15

OKR項(xiàng)目管理

2022-04-19 08:15:53

DDD領(lǐng)域建模實(shí)戰(zhàn)

2021-09-08 09:48:39

數(shù)據(jù)庫工具技術(shù)

2016-08-31 09:19:57

2025-07-15 10:06:54

2023-07-04 07:53:53

MVCDDD架構(gòu)

2023-02-23 12:02:12

OKR跟蹤項(xiàng)目管理
點(diǎn)贊
收藏

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

麻豆影院在线观看| 日韩免费av网站| 试看120秒一区二区三区| 一区二区三区欧美在线观看| 国产欧美日韩伦理| 日韩免费av网站| 午夜亚洲福利| 亚洲毛片在线看| 欧美日韩久久婷婷| 一区二区精品伦理...| 国产精品私房写真福利视频| 97人人干人人| 91porny九色| 午夜欧美视频| 亚洲天堂av高清| 在线成人免费av| 暖暖成人免费视频| 一级中文字幕一区二区| 青娱乐国产91| 日韩一级片免费在线观看| 秋霞成人午夜伦在线观看| 久久久久久久久国产| 永久免费av无码网站性色av| 色妞ww精品视频7777| 欧洲国内综合视频| 国内精品在线观看视频| 精品176二区| 久久久综合激的五月天| 亚洲一区精品电影| 久久久999久久久| 国产日韩欧美一区二区三区在线观看| 久久九九热免费视频| brazzers精品成人一区| 欧美日韩夜夜| 精品少妇一区二区三区在线视频| 高清一区二区视频| 暖暖成人免费视频| 欧美日韩国产中文精品字幕自在自线| 成人在线免费观看网址| av电影在线观看网址| xfplay精品久久| 国产情人节一区| 国产www在线| aⅴ色国产欧美| 欧美激情按摩在线| 综合五月激情网| 亚洲v在线看| 最新国产精品拍自在线播放| 国产毛片欧美毛片久久久| 天堂在线精品| 日韩经典第一页| 亚洲av成人片色在线观看高潮 | 九色网友自拍视频手机在线| 成人av免费在线播放| 国产激情一区二区三区在线观看 | 色综合一本到久久亚洲91| 天天色综合天天| 成人一对一视频| 黄色18在线观看| 精品福利在线视频| 国产男女在线观看| 欧美日韩美女| 在线观看亚洲成人| 牛夜精品久久久久久久| 免费在线观看一区| 欧美日韩在线播| 激情在线观看视频| 亚洲精品v亚洲精品v日韩精品| 欧美一区二区三区在线| aaaaaaaa毛片| caoporn成人| 日韩国产激情在线| 亚洲自拍偷拍图| 久久神马影院| 欧美老女人性生活| 日本在线视频免费观看| 男人的天堂成人在线| 国产第一区电影| 国产精品羞羞答答在线| 懂色av一区二区三区免费看| 精品国产综合区久久久久久| 国产最新视频在线观看| 亚洲日本欧美天堂| 欧美国产日韩激情| 小黄鸭精品aⅴ导航网站入口| 欧美在线免费播放| 黄色一级片免费播放| 国产美女撒尿一区二区| 亚洲日本欧美中文幕| 熟女少妇a性色生活片毛片| 欧美激情五月| 日本高清久久天堂| 国产精品视频第一页| 成人激情小说乱人伦| 日韩欧美视频一区二区三区四区| 国产激情在线| 欧美午夜影院在线视频| 91免费视频污| 在线成人动漫av| 美日韩精品免费观看视频| 国产福利拍拍拍| 国产一区二区三区四区在线观看| 成人动漫在线观看视频| av网站在线免费观看| 亚洲一区二区三区四区五区黄 | 日本xxxxx18| 小h片在线观看| 欧美一区二区三区日韩视频| 亚洲自拍偷拍一区二区| 欧美福利专区| 国产精品电影网| 成人久久久精品国产乱码一区二区| 久久一区二区三区四区| 91国在线高清视频| 日本在线精品| 亚洲国产成人在线播放| 永久免费看片直接| 日韩不卡手机在线v区| 国产一区在线免费| caopon在线免费视频| 欧洲生活片亚洲生活在线观看| 99久久久无码国产精品性波多| 日韩在线第七页| 欧洲亚洲免费在线| 欧美熟女一区二区| 一区二区三区精品久久久| 鲁一鲁一鲁一鲁一av| 日韩影视高清在线观看| 久久久久久久亚洲精品| 99国产精品99| 中文字幕一区二区三区在线播放 | 一区二区三区欧美成人| 伊人久久综合一区二区| 亚洲国内精品在线| 精品少妇一二三区| 国产精品系列在线观看| 中文字幕一区二区三区最新| 国产亚洲一区二区手机在线观看 | 欧美1o一11sex性hdhd| 牛牛精品视频在线| 日韩欧美高清一区| 91视频综合网| 国产一区二三区好的| 在线视频福利一区| 欧洲美女精品免费观看视频| 中文在线资源观看视频网站免费不卡| 国产又黄又猛又粗又爽| 94色蜜桃网一区二区三区| 欧美精品自拍视频| 国内精品国产成人国产三级粉色 | 中文字幕欧美日韩va免费视频| 国产成人一级片| 国产午夜精品美女毛片视频| 日韩在线第三页| 国产亚洲一卡2卡3卡4卡新区 | 成人欧美一区二区三区| 日韩成人精品视频在线观看| 999成人网| 91亚洲人电影| 日韩激情美女| 亚洲黄色免费三级| 中文字幕一区二区人妻电影| 久久久久99精品一区| 免费午夜视频在线观看| 国内精品视频在线观看| 成人高清视频观看www| 国产成人高清精品| 精品国产一区二区三区不卡| 国产特黄大片aaaa毛片| 久久久久久黄色| 亚洲性图一区二区| 欧美 亚欧 日韩视频在线 | 嫩草在线播放| 欧美在线观看一二区| 精品无码一区二区三区蜜臀| 国产福利一区二区三区视频在线 | 麻豆精品新av中文字幕| 日韩最新中文字幕| 女仆av观看一区| 国产精品看片资源| 18videosex性欧美麻豆| 亚洲精品电影网| 中文字幕日韩第一页| 亚洲美女区一区| 亚洲久久久久久| 美女视频黄频大全不卡视频在线播放| 国产对白在线播放| 日韩理论电影中文字幕| 国产免费一区二区三区在线能观看| 日本性爱视频在线观看| 亚洲天堂网站在线观看视频| 国产免费不卡av| 日韩欧美综合在线视频| av激情在线观看| 国产天堂亚洲国产碰碰| 制服.丝袜.亚洲.中文.综合懂| 性欧美videos另类喷潮| 精品国产无码在线| 亚洲第一福利社区| 亚洲一区二区三区777| 成人欧美一区二区三区的电影| 久久天堂电影网| 你懂的在线视频| 欧美sm极限捆绑bd| 91成人国产综合久久精品| 欧美视频裸体精品| 天天综合天天做| 国产亚洲欧洲一区高清在线观看| 91精产国品一二三| 久久精品国产亚洲a| 国产午夜伦鲁鲁| 综合色一区二区| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲青青一区| 国产成人在线视频| 成人性生交大片免费看网站| 精品国产一区久久久| 精品无吗乱吗av国产爱色| 欧美va亚洲va在线观看蝴蝶网| 亚洲精品无码久久久久 | 一级黄色小视频| 欧美午夜激情视频| 欧美日韩国产精品综合| 亚洲欧洲在线观看av| 蜜桃传媒一区二区亚洲| 99re这里都是精品| 日本一区二区在线观看视频| 国产精品一区二区x88av| 国产一二三区av| 97精品人妻一区二区三区| 超碰在线无需免费| 亚洲美女视频网站| 亚洲av成人精品毛片| 精品久久久影院| 精品国产黄色片| 欧美日本在线视频| 最近中文字幕免费在线观看| 色综合网站在线| 在线精品免费视| 日韩欧美国产视频| 久久久精品福利| 午夜成人在线视频| 国产一级在线视频| 亚洲第一精品在线| 日本熟女一区二区| 亚洲va国产天堂va久久en| 久久久久久免费观看| 一区二区三区视频在线看| 成人一级黄色大片| 日韩理论片中文av| 国产精品久久久精品四季影院| 综合av第一页| 欧美成人综合色| 亚洲一区二区精品久久av| 久久午夜无码鲁丝片| 亚洲一区二区av在线| 国产在线视频第一页| 午夜视频在线观看一区二区三区| 国产在线拍揄自揄拍| 欧美日韩午夜剧场| 日韩三级一区二区| 欧美日韩久久一区二区| 国产乱人乱偷精品视频| 日韩欧美一级二级三级久久久| 亚洲黄色精品视频| 国产视频精品免费播放| 国产成人天天5g影院在线观看| 伊人久久久久久久久久久| 黄色成年人视频在线观看| 欧美日本中文字幕| 国产色播av在线| 国产福利成人在线| 精品国产不卡一区二区| 国产精品一区二区av| 伊人久久综合影院| japanese在线视频| 亚洲精品专区| 第四色婷婷基地| 成人一区二区三区视频| 无码 人妻 在线 视频| 亚洲色图在线看| 日韩 欧美 亚洲| 欧美色视频一区| 狠狠躁日日躁夜夜躁av| 亚洲人成网7777777国产| 黄网站在线免费| 97超碰蝌蚪网人人做人人爽| 成人国产精品入口免费视频| 成人91免费视频| 国产欧美日韩在线观看视频| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 精品视频一区二区在线观看| 色婷婷av一区二区三区软件| 国产美女www爽爽爽视频| 亚洲精品丝袜日韩| 超碰在线观看免费版| 欧美在线视频免费播放| 国产麻豆精品| 欧洲成人一区二区| 国产精品扒开腿做爽爽爽软件| 激情视频综合网| av电影一区二区| 看免费黄色录像| 在线视频国产一区| 手机看片福利永久| 久久久精品一区二区| 日本成人三级电影| 国产精品一区二区在线观看| 91欧美在线| 精品www久久久久奶水| 成人丝袜高跟foot| 91n在线视频| 91成人网在线| 深夜福利视频在线免费观看| 另类少妇人与禽zozz0性伦| 欧美色999| 久久精品成人一区二区三区蜜臀 | 欧美精品在线免费播放| 亚洲国产尤物| 免费精品视频一区| 激情欧美丁香| 午夜影院免费观看视频| 中文成人av在线| 无码aⅴ精品一区二区三区| 亚洲第一区第二区| 婷婷色在线播放| 成人信息集中地欧美| 色综合五月天| 午夜免费福利在线| 国产午夜精品久久久久久久| 国产毛片aaa| 亚洲国产精品成人一区二区| 日本aa在线| 99视频免费观看蜜桃视频| 久久久久电影| 国产欧美一区二| 亚洲欧洲日产国码二区| 在线观看色网站| 中文字幕日韩高清| 成人精品国产| 亚洲欧美在线网| 久久精品99国产国产精| 一二三四在线观看视频| 精品视频在线免费看| 91视频在线观看| 成人国产精品一区二区| 欧美独立站高清久久| 最新免费av网址| 亚洲欧美色综合| 精品国产一级片| 欧美黑人一级爽快片淫片高清| 欧美9999| 国产高清av在线播放| fc2成人免费人成在线观看播放| 日本少妇性高潮| 精品一区电影国产| 欧美电影免费观看| 亚洲精品久久久久久一区二区| 美女视频网站久久| 91 在线视频| 精品国产乱码久久久久久老虎| 538在线观看| 欧美日韩一区二区视频在线观看| 日日摸夜夜添夜夜添精品视频| 粉嫩精品久久99综合一区| 欧美精品久久久久久久多人混战| 高清全集视频免费在线| 高清不卡一区二区三区| 国产欧美一区二区三区国产幕精品| 国产交换配乱淫视频免费| 欧美亚一区二区| 羞羞网站在线看| 久久精品国产综合精品| 日本欧美一区二区三区| 国产精品免费人成网站酒店| 欧美大片顶级少妇| 在线看片福利| 一区二区免费在线观看| 粉嫩在线一区二区三区视频| 在线观看日本视频| 按摩亚洲人久久| 欧美电影在线观看完整版| 韩国一区二区av| 亚洲美女区一区| 九色网友自拍视频手机在线| 91夜夜揉人人捏人人添红杏| 99精品国产在热久久婷婷| 老司机精品免费视频| 精品国产乱码久久久久久久| 成人视屏在线观看| 91免费版看片| 国产女人aaa级久久久级| www日本视频| 国产精品入口免费视| 亚洲高清网站| 男人在线观看视频| 亚洲奶大毛多的老太婆| 免费欧美网站| 自拍偷拍 国产| 亚洲va韩国va欧美va精品 |