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

CTO:別再寫一摞if-else了,再寫開除!

開發 前端 開發工具
代碼潔癖狂們!看到一個類中有幾十個 if-else 是不是很抓狂?設計模式學了用不上嗎?面試的時候問你,你只能回答最簡單的單例模式,問你有沒有用過反射之類的高級特性,回答也是否嗎?

 代碼潔癖狂們!看到一個類中有幾十個 if-else 是不是很抓狂?設計模式學了用不上嗎?面試的時候問你,你只能回答最簡單的單例模式,問你有沒有用過反射之類的高級特性,回答也是否嗎?

[[328874]]
圖片來自 Pexels

 

這次就讓設計模式(模板方法模式+工廠模式)和反射助你消滅 if-else!真的是開發中超有用的干貨啊!

1.那個坑貨

某日,碼農胖滾豬接到上級一個需求,這個需求牛逼了,一站式智能報表查詢平臺,支持 MySQL、Pgxl、TiDB、Hive、Presto、Mongo 等眾多數據源,想要啥數據都能通通給你查出來展示,對于業務人員數據分析有重大意義!

雖然各個數據源的參數校驗、查詢引擎和查詢邏輯都不一樣,但是胖滾豬對這些框架都很熟悉,這個難不倒她,她只花了一天時間就都寫完了。

領導胖滾熊也對胖滾豬的效率表示了肯定。可是好景不長,第三天,領導閑著沒事,準備做一下 Code Review,可把胖滾熊驚呆了,一個類里面有近 30 個 if-else 代碼,我滴個媽呀,這可讓代碼潔癖狂崩潰了。

  1. // 檢驗入參合法性 
  2. Boolean check = false
  3. if(DataSourceEnum.hive.equals(dataSource)){ 
  4.     check = checkHiveParams(params); 
  5. else if(DataSourceEnum.tidb.equals(dataSource)){ 
  6.     check = checkTidbParams(params); 
  7. else if(DataSourceEnum.mysql.equals(dataSource)){ 
  8.     check = checkMysqlParams(params); 
  9. } // else if ....... 省略pgxl、presto等 
  10. if(check){ 
  11.     if(DataSourceEnum.hive.equals(dataSource)){ 
  12.         list = queryHive(params); 
  13.     } else if(DataSourceEnum.tidb.equals(dataSource)){ 
  14.         list = queryTidb(params); 
  15.     } else if(DataSourceEnum.mysql.equals(dataSource)){ 
  16.         list = queryMysql(params); 
  17.     } // else if ....... 省略pgxl、presto等 
  18. //記錄日志 
  19. log.info("用戶={} 查詢數據源={} 結果size={}",params.getUserName(),params.getDataSource(),list.size()); 

2.模板模式來救場

首先我們來分析下,不管是什么數據源,算法結構(流程)都是一樣的:

  • 校驗參數合法性
  • 查詢
  • 記錄日志

這不就是說模板一樣、只不過具體細節不一樣,沒錯吧?讓我們來看看設計模式中模板方法模式的定義吧:

模板方法模式:定義一個操作中的算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。通俗的講,就是將子類相同的方法,都放到其抽象父類中。

我們這需求不就和模板方法模式差不多嗎?因此我們可以把模板抽到父類(抽象類)中。至于特定的步驟實現不一樣,這些特殊步驟,由子類去重寫就好了。

廢話不多說了,我們先把父類模板寫好吧,完全一樣的邏輯是記錄日志,這步在模板寫死就好。

至于檢驗參數和查詢,這兩個方法各不相同,因此需要置為抽象方法,由子類去重寫。

  1. public abstract class AbstractDataSourceProcesser <T extends QueryInputDomain> { 
  2.     public List<HashMap> query(T params){ 
  3.         List<HashMap> list = new ArrayList<>(); 
  4.         //檢驗參數合法性 不同的引擎sql校驗邏輯不一樣 
  5.         Boolean b = checkParam(params); 
  6.         if(b){ 
  7.             //查詢 
  8.             list = queryData(params); 
  9.         } 
  10.         //記錄日志 
  11.         log.info("用戶={} 查詢數據源={} 結果size={}",params.getUserName(),params.getDataSource(),list.size()); 
  12.         return list; 
  13.     } 
  14.     //抽象方法 由子類來實現特定邏輯 
  15.     abstract Boolean checkParam(T params); 
  16.     abstract List<HashMap> queryData(T params); 

這段代碼非常簡單。但是為了照顧新手,還是想解釋一個東西:T 這個玩意。叫泛型,因為不同數據源的入參不一樣,所以我們使用泛型。

但是他們也有公共的參數,比如用戶名。因此為了不重復冗余,更好的利用公共資源及規范入參,在泛型的設計上,我們可以有一個泛型上限,

  1. public class QueryInputDomain<T> { 
  2.     public String userName;//查詢用戶名 
  3.     public String dataSource;//查詢數據源 比如mysql\tidb等 
  4.     public T params;//特定的參數 不同的數據源參數一般不一樣 
  5. public class MysqlQueryInput extends QueryInputDomain{ 
  6.     private String database;//數據庫 
  7.     public String sql;//sql 

接下來就輪到子類出場了,通過上面的分析,其實也很簡單了,不過是繼承父類,重寫 checkParam() 和 queryData() 方法。

下面以 MySQL 數據源為例,其他數據源也都一樣的套路:

  1. @Component("dataSourceProcessor#mysql"
  2. public class MysqlProcesser extends AbstractDataSourceProcesser<MysqlQueryInput>{ 
  3.     @Override 
  4.     public Boolean checkParam(MysqlQueryInput params) { 
  5.         System.out.println("檢驗mysql參數是否準確"); 
  6.         return true
  7.     } 
  8.  
  9.     @Override 
  10.     public List<HashMap> queryData(MysqlQueryInput params) { 
  11.         List<HashMap> list = new ArrayList<>(); 
  12.         System.out.println("開始查詢mysql數據"); 
  13.         return list; 
  14.     } 

這樣一來,所有的數據源,都自成一體,擁有一個只屬于自己的類,后續要擴展數據源、或者要修改某個數據源的邏輯,都非常方便和清晰了。

說實話,模板方法模式太簡單了,抽象類這東西也太基礎普遍了,一般應屆生都會知道的。

但是對于初入職場的新人來說,還真不太能果斷應用在實際生產中。因此提醒各位:一定要有一個抽象思維,避免代碼冗余重復。

另外,要再啰嗦幾句,即使工作有幾年的工程師也很容易犯一個錯誤。就是把思維局限在今天的需求。

比如老板一開始只給你一個 MySQL 數據源查詢的需求,壓根沒有 if-else,可能你就不會放在心上,直接在一個類中寫死,不會考慮到后續的擴展。

直到后面越來越多的新需求,你才恍然大悟,要全部重構一番,這樣浪費自己的時間了。

因此提醒各位:做需求不要局限于今天,要考慮到未來。從一開始就做到高擴展性,后續需求變更和維護就非常爽了。

3.工廠模式來救場

  1. #Phone類:手機標準規范類(AbstractProduct) 
  2. public interface Phone { 
  3.     void make(); 
  4. #MiPhone類:制造小米手機(Product1) 
  5. public class MiPhone implements Phone { 
  6.     public MiPhone() { 
  7.         this.make(); 
  8.     } 
  9.     @Override 
  10.     public void make() { 
  11.         System.out.println("make xiaomi phone!"); 
  12.     } 
  13. #IPhone類:制造蘋果手機(Product2) 
  14. public class IPhone implements Phone { 
  15.     public IPhone() { 
  16.         this.make(); 
  17.     } 
  18.     @Override 
  19.     public void make() { 
  20.         System.out.println("make iphone!"); 
  21.     } 

但是模板模式還是沒有完全解決胖滾豬的 if-else,因為需要根據傳進來的 dataSource 參數,判斷由哪個 service 來實現查詢邏輯,現在是這么寫的:

  1. if(DataSourceEnum.hive.equals(dataSource)){ 
  2.        list = queryHive(params); 
  3.    } else if(DataSourceEnum.tidb.equals(dataSource)){ 
  4.        list = queryTidb(params); 
  5.    } 

那么這種 if-else 應該怎么去干掉呢?我想先跟你講講工廠模式的那些故事。

工廠模式:工廠方法模式是一種創建對象的模式,它被廣泛應用在 jdk 中以及 Spring 和 Struts 框架中。它將創建對象的工作轉移到了工廠類。

為了呼應一下工廠兩字,我特意舉一個代工廠的例子讓你理解,這樣你應該會有更深刻的印象。

以手機制造業為例。我們知道有蘋果手機、小米手機等等,每種品牌的手機制造方法必然不相同,我們可以先定義好一個手機標準接口,這個接口有 make() 方法,然后不同型號的手機都繼承這個接口:

  1. #Phone類:手機標準規范類(AbstractProduct) 
  2. public interface Phone { 
  3.     void make(); 
  4. #MiPhone類:制造小米手機(Product1) 
  5. public class MiPhone implements Phone { 
  6.     public MiPhone() { 
  7.         this.make(); 
  8.     } 
  9.     @Override 
  10.     public void make() { 
  11.         System.out.println("make xiaomi phone!"); 
  12.     } 
  13. #IPhone類:制造蘋果手機(Product2) 
  14. public class IPhone implements Phone { 
  15.     public IPhone() { 
  16.         this.make(); 
  17.     } 
  18.     @Override 
  19.     public void make() { 
  20.         System.out.println("make iphone!"); 
  21.     } 

現在有某手機代工廠:【天霸手機代工廠】。客戶只會告訴該工廠手機型號,就要匹配到不同型號的制作方案,那么代工廠是怎么實現的呢?

其實也很簡單,簡單工廠模式(還有抽象工廠模式和工廠方法模式,有興趣可以了解下)是這么實現的:

  1. #PhoneFactory類:手機代工廠(Factory) 
  2. public class PhoneFactory { 
  3.     public Phone makePhone(String phoneType) { 
  4.         if(phoneType.equalsIgnoreCase("MiPhone")){ 
  5.             return new MiPhone(); 
  6.         } 
  7.         else if(phoneType.equalsIgnoreCase("iPhone")) { 
  8.             return new IPhone(); 
  9.         } 
  10.     } 

這樣客戶告訴你手機型號,你就可以調用代工廠類的方法去獲取到對應的手機制造類。

你會發現其實也不過是 if-else,但是把 if-else 抽到一個工廠類,由工廠類統一創建對象,對我們的業務代碼無入侵,不管是維護還是美觀上都會好很多。

 

首先,我們應該在每個特定的 dataSourceProcessor(數據源執行器),比如 MysqlProcesser、TidbProcesser 中添加 Spring 容器注解 @Component。

該注解我想應該不用多解釋了吧,重點是:我們可以把不同數據源都搞成類似的 bean name,形如 dataSourceProcessor#數據源名稱,如下兩段代碼:

  1. @Component("dataSourceProcessor#mysql"
  2. public class MysqlProcesser extends AbstractDataSourceProcesser<MysqlQueryInput>{ 
  3. @Component("dataSourceProcessor#tidb"
  4. public class TidbProcesser extends AbstractDataSourceProcesser<TidbQueryInput>{ 

這樣有什么好處呢?我可以利用 Spring 幫我們一次性加載出所有繼承于 AbstractDataSourceProcesser 的 Bean ,形如 Map

Key 是 Bean 的名稱,而 Value 則是對應的 Bean:

  1. @Service 
  2. public class QueryDataServiceImpl implements QueryDataService { 
  3.     @Resource 
  4.     public Map<String, AbstractDataSourceProcesser> dataSourceProcesserMap; 
  5.     public static String beanPrefix = "dataSourceProcessor#"
  6.     @Override 
  7.     public List<HashMap> queryData(QueryInputDomain domain) { 
  8.         AbstractDataSourceProcesser dataSourceProcesser = dataSourceProcesserMap.get(beanPrefix + domain.getDataSource()); 
  9.         //省略query代碼 
  10.     } 

可能你還是不太理解,我們直接看一下運行效果:

①dataSourceProcesserMap 內容如下所示,存儲了所有數據源 Bean,Key 是 Bean 的名稱、而 Value 則是對應的 Bean:

 

②我只需要通過 key(即前綴+數據源名稱=beanName),就能匹配到對應的執行器了。

比如當參數 dataSource 為 tidb 的時候,key 為 dataSourceProcessor#tidb。

根據 key 可以直接從 dataSourceProcesserMap 中獲取到 TidbProcesser:

 

4.反射來救場

 

還是直接來看看代碼吧:

  1. public static String classPrefix = "com.lyl.java.advance.service."
  2.  
  3. AbstractDataSourceProcesser sourceGenerator =  
  4. (AbstractDataSourceProcesser) Class.forName 
  5. (classPrefix+DataSourceEnum.getClasszByCode(domain.getDataSource())) 
  6. .newInstance(); 

需要注意的是,該種方法是通過 className 來獲取到類的實例,而前端傳參肯定是不會傳 className 過來的。

因此可以用到枚舉類,去定義好不同數據源的類名:

  1. public enum DataSourceEnum { 
  2.     mysql("mysql""MysqlProcesser"), 
  3.     tidb("tidb""TidbProcesser"); 
  4.     private String code; 
  5.     private String classz; 

5.總結

有些童鞋總覺得設計模式用不上,因為平時寫代碼除了 CRUD 還是 CRUD,面試的時候問你設計模式,你只能回答最簡單的單例模式,問你有沒有用過反射之類的高級特性,回答也是否。

其實不然,Java 這 23 種設計模式,每一個都是經典。今天我們就用模板方法模式+工廠模式(或者反射)解決了讓人崩潰的 if-else。

后續對于設計模式的學習,也應該多去實踐,從真實的項目中找到用武之地,你才算真正把知識占為己有了。

本篇文章的內容和技術點雖然很簡單,但旨在告訴大家應該要有一個很好的代碼抽象思維。杜絕在代碼中出現一大摞 if-else 或者其他爛代碼。

即使你有很好的代碼抽象思維,做需求開發的時候,也不要局限于當下,只考慮現在,要多想想未來的擴展性。

就像你談戀愛一樣,只考慮當下的是渣男,考慮到未來的,才算是一個負責任的人,"愿世界沒有渣男"!

作者:Liuyanling

編輯:陶家龍

出處:轉載自微信公眾號胖滾豬學編程(ID:bdstar_lyl)

責任編輯:武曉燕 來源: 胖滾豬學編程
相關推薦

2020-12-15 09:31:58

CTOif-else代碼

2020-06-15 08:12:51

try catch代碼處理器

2023-08-25 13:34:02

JavascriptWikipediaSlack

2025-09-01 01:33:00

DockerBuild命令

2020-09-01 21:03:10

Springboot格式化方式

2025-07-28 05:00:00

2022-02-21 12:29:01

for循環前端

2023-06-02 07:30:24

If-else結構流程控制

2025-09-15 01:55:00

緩存代碼Easy-Cache開發

2022-08-10 10:36:22

Pythonfor

2024-12-20 18:00:00

C++折疊表達式C++17

2025-09-17 07:40:47

2025-01-15 12:31:46

2025-08-29 00:00:00

2013-03-06 10:28:57

ifJava

2021-05-17 14:57:23

策略模式代碼

2020-10-22 09:20:22

SQLNoSQL 數據庫

2021-04-13 06:39:13

代碼重構code

2021-03-10 07:20:43

if-else靜態代碼

2022-07-11 08:16:55

策略模式if-else
點贊
收藏

51CTO技術棧公眾號

欧洲免费在线视频| 久草视频手机在线| 综合久久2023| 欧美国产日韩a欧美在线观看| 国产日韩欧美视频| 日韩在线观看视频一区二区| 黄色免费大全亚洲| 欧美影视一区二区三区| 亚洲欧洲中文| 国产超碰人人模人人爽人人添| 亚洲国产网站| 一区二区三区视频在线 | 免费看男女www网站入口在线| 久久嫩草精品久久久久| 国产精品成人免费电影| 国产高清视频免费在线观看| 国产精品国产亚洲精品| 欧美日韩亚洲成人| 亚洲午夜精品久久| 日本不卡视频一区二区| 国产在线视频一区二区| 日本一区二区三区四区视频| 久久国产露脸精品国产| 精品色999| 亚洲国产成人91精品| 一区二区三区国产免费| 日本无删减在线| 国产精品第一页第二页第三页| 国产三级精品在线不卡| 国产精品久久久久久无人区| 男人天堂欧美日韩| 久久免费视频网站| 加勒比av在线播放| 97精品一区| 一区二区三区在线播放欧美| 丰满少妇一区二区三区| xxxxxhd亚洲人hd| 777午夜精品免费视频| 久草在在线视频| 精品众筹模特私拍视频| 成人欧美一区二区三区在线播放| 欧洲一区二区日韩在线视频观看免费 | 国内视频精品| 久久影视免费观看| 亚洲区一区二区三| 久久在线免费| 中文国产亚洲喷潮| 蜜桃久久精品成人无码av| 欧美三级午夜理伦三级小说| 精品欧美乱码久久久久久1区2区 | 成人国产精品免费网站| 5g影院天天爽成人免费下载| 91中文字幕在线播放| 美女视频一区二区三区| 国产精品日韩专区| 夜夜躁很很躁日日躁麻豆| 蜜臂av日日欢夜夜爽一区| 国产精品视频久| 中文字幕永久在线观看| 日本aⅴ亚洲精品中文乱码| 国产成人精品免费久久久久| 国产成人自拍视频在线| 在线欧美亚洲| 欧美一级在线亚洲天堂| 日本中文字幕在线免费观看| 怡红院精品视频在线观看极品| 欧美激情欧美激情| 精品无码人妻一区二区三| 影音国产精品| 欧美孕妇与黑人孕交| 日日摸天天添天天添破| 噜噜噜91成人网| 国产精品情侣自拍| 国产免费不卡视频| 成人高清av在线| 精品伦精品一区二区三区视频| 天天爽夜夜爽夜夜爽| 91啪九色porn原创视频在线观看| 九九九九九九精品| 国产鲁鲁视频在线观看免费| 中文字幕一区在线观看| 欧美少妇在线观看| av电影院在线看| 色综合天天综合网国产成人综合天 | 91xxx在线观看| 亚洲你懂的在线视频| 无码粉嫩虎白一线天在线观看| 国产欧洲在线| 欧美撒尿777hd撒尿| 欧美性猛交xx| 香蕉精品久久| 日韩专区在线播放| 国产午夜福利片| 日韩成人免费在线| 91免费在线观看网站| 深夜福利免费在线观看| 中文字幕在线一区| av网站在线观看不卡| 日韩欧国产精品一区综合无码| 欧美va在线播放| 国产女主播喷水高潮网红在线| 99久久精品费精品国产风间由美| 久久久爽爽爽美女图片| 波多野结衣理论片| 成人免费视频app| 日韩中文字幕一区二区| 女同视频在线观看| 欧美日韩在线综合| 免费黄色三级网站| 亚洲精品一区二区妖精| 91tv亚洲精品香蕉国产一区7ujn| 一区二区三区精| 久久午夜电影网| 成人免费a级片| 欧美一级做一级爱a做片性| 日韩国产在线播放| 久久国产精品国语对白| 日精品一区二区| 国产欧美日本在线| av文字幕在线观看| 在线观看91视频| 中文字幕第3页| 91精品国产91久久久久久密臀| 欧美综合激情网| 亚洲成熟女性毛茸茸| 国产精品国产三级国产aⅴ入口| 免费看的黄色大片| 动漫视频在线一区| 欧美精品少妇videofree| 怡红院成永久免费人全部视频| 91在线免费播放| 久久av综合网| 涩涩屋成人免费视频软件| 色香阁99久久精品久久久| 老熟妇仑乱一区二区av| 91在线云播放| 欧美视频在线观看网站| www.丝袜精品| 欧美国产精品日韩| 国产视频一区二区三| 国产精品美女一区二区在线观看| 毛片一区二区三区四区| 欧美日韩大片免费观看| 97精品国产aⅴ7777| 黄色一级a毛片| 亚洲一区二区三区四区五区中文| 黄色一级片免费播放| 国产精品久久久久久久久妇女| 国产精品一区二区三区在线播放 | 大胆人体色综合| 一级片视频网站| 国产精品二三区| 艹b视频在线观看| 欧美韩国日本在线观看| 国产一区香蕉久久| 欧美极品视频| 日韩一区二区三区免费观看| 国产黄色片在线免费观看| 国产高清在线观看免费不卡| 日韩精品手机在线观看| 亚洲视频三区| 91高清视频在线免费观看| 五月天丁香视频| 欧美特级www| 亚洲一区二区自偷自拍| 蜜桃av噜噜一区| 日韩视频在线免费播放| 试看120秒一区二区三区| 欧美激情亚洲自拍| 欧美一区二区少妇| 欧美天天综合网| 天天爽天天爽天天爽| 国产乱子伦视频一区二区三区 | 久久99精品久久久水蜜桃| 欧美a级在线观看| 亚洲欧洲视频在线| 亚洲自拍偷拍另类| 亚洲一区在线观看视频| 中文字幕一区二区三区人妻| 奇米色777欧美一区二区| 91制片厂免费观看| 久久porn| 国产精品女主播| 四虎亚洲成人| 亚洲欧美制服丝袜| 97超碰资源站| 亚洲成人免费电影| av永久免费观看| 国产伦精品一区二区三区视频青涩 | 成人免费在线电影| 欧美一级在线视频| 成人在线免费看视频| 国产精品乱子久久久久| 亚洲午夜久久久久久久久| 日韩av在线免费观看不卡| 樱空桃在线播放| 少妇精品导航| 亚洲一区二区三区久久| 在线观看的黄色| 久久综合伊人77777| 日韩欧美在线观看一区二区| 4438x亚洲最大成人网| 中文字幕精品三级久久久| 亚洲婷婷在线视频| 丰腴饱满的极品熟妇| 国产精品69久久久久水密桃| 国产三级日本三级在线播放| 激情六月综合| 午夜久久久久久久久久久| 美女毛片一区二区三区四区| 国产99视频精品免费视频36| 日韩免费电影| 高清视频欧美一级| 国产在线高清视频| 亚洲欧洲xxxx| 色一情一乱一乱一区91av| 欧美猛男男办公室激情| 国产免费一级视频| 亚洲成人激情自拍| 男人与禽猛交狂配| 国产免费成人在线视频| 亚洲专区区免费| 粉嫩av亚洲一区二区图片| 不卡的av中文字幕| 久久久久久网| 成人免费观看cn| 国内精品美女在线观看| 国产又粗又硬又长| 视频在线不卡免费观看| 日本高清不卡一区二区三| 日韩母乳在线| 精品国产乱码久久久久久郑州公司 | 久久国产精品一区| 国产一区二区日韩精品欧美精品| 午夜影院在线视频| 亚洲成人激情在线观看| 精品人妻少妇嫩草av无码专区 | 网站一区二区三区| 久久婷婷av| 人妻内射一区二区在线视频| 免费欧美日韩| 91精品91久久久中77777老牛| 在线国产日韩| 亚洲人精品午夜射精日韩| 欧美日韩一区二区国产| 免费观看亚洲视频| 欧美日本一区| 妺妺窝人体色www看人体| 午夜激情一区| 女人床在线观看| 亚洲视频一区| 国产精品一区二区免费在线观看 | 欧美日韩中文在线视频| 国产精品免费看| 亚洲国产精品久久久久婷蜜芽| 99视频一区| 日韩精品一区二区三区不卡| 日日骚欧美日韩| 中文字幕第38页| 韩国精品一区二区| 日本r级电影在线观看| 成人一区在线看| 国产精品无码电影| 久久蜜桃香蕉精品一区二区三区| a天堂中文字幕| 中文子幕无线码一区tr| 亚洲 欧美 变态 另类 综合| 亚洲欧美另类小说| 国产 日韩 欧美 成人| 欧美日韩激情视频| 色婷婷久久综合中文久久蜜桃av| 5858s免费视频成人| www.成人在线观看| 亚洲国产三级网| 懂色一区二区三区| 萌白酱国产一区二区| 7777kkk亚洲综合欧美网站| 2025国产精品视频| 国语自产精品视频在线看抢先版结局| 91精品综合视频| 国产精品网址| 视频一区免费观看| 一本精品一区二区三区| 成年人午夜免费视频| 日韩精品色哟哟| 一起操在线视频| 成人久久18免费网站麻豆| 国产精品高清无码在线观看| 综合婷婷亚洲小说| 日韩av大片在线观看| 欧美日韩精品电影| 欧美一区二区三区激情| 国产亚洲在线播放| 欧美xxxx做受欧美88bbw| 国产成人综合一区二区三区| 永久免费精品视频| 色999日韩自偷自拍美女| 欧美日韩一区二区国产| 9久久婷婷国产综合精品性色 | 亚洲一二三四视频| 一区二区三区91| www.五月婷婷.com| 欧美精品一区二区三区高清aⅴ| 成a人v在线播放| 韩国19禁主播vip福利视频| 91在线亚洲| 精品无人区一区二区三区竹菊| 99九九热只有国产精品| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 激情五月婷婷综合| xxx在线播放| 激情成人中文字幕| 99久久精品国产色欲| 中文字幕精品在线视频| 捆绑调教日本一区二区三区| 亚洲综合视频1区| 欧美一区二区性| 男女高潮又爽又黄又无遮挡| 国产成人精品aa毛片| 特级西西人体高清大胆| 欧美天天综合色影久久精品| 亚洲精品久久久久avwww潮水| 色噜噜狠狠狠综合曰曰曰88av | 色哟哟国产精品免费观看| 亚洲精品国产suv一区| 日韩三级影视基地| 777午夜精品电影免费看| 久久久久久久久久久久久久久久av| 午夜精彩国产免费不卡不顿大片| 91av视频免费观看| 中文字幕av资源一区| 夜夜爽妓女8888视频免费观看| 亚洲精品国精品久久99热| 爱情岛亚洲播放路线| 91手机在线观看| 一区二区日韩欧美| 亚洲综合20p| 亚洲精品国产一区二区精华液 | 日韩高清成人| 欧美成熟毛茸茸复古| av成人黄色| 久久人人爽人人人人片| 亚洲福利一区二区| 欧美 日韩 综合| 国内伊人久久久久久网站视频 | 精品一区二区三区久久| 亚洲天堂av中文字幕| 在线观看国产91| 9色在线观看| 国产日韩av高清| 亚洲成人国产| 成人三级做爰av| 亚洲妇熟xx妇色黄| 日韩在线观看视频一区二区三区| 久久青草福利网站| 韩国精品福利一区二区三区| 欧美精品自拍视频| 久久婷婷国产综合国色天香 | 日韩一区精品字幕| 中文字幕伦理片| 欧美高清dvd| 丝袜中文在线| 久久久久国产精品视频| 久久精品一区| 四虎影视1304t| 欧美一级在线视频| a在线视频v视频| 麻豆传媒一区| 奇米精品一区二区三区在线观看一 | 少妇高潮喷水久久久久久久久久| 久久久午夜精品| 一二三区中文字幕| 色综合久综合久久综合久鬼88| 第一区第二区在线| 免费日韩中文字幕| 亚洲欧洲99久久| 日韩一区免费视频| 国产精品电影观看| 综合激情婷婷| 真人bbbbbbbbb毛片| 欧美网站一区二区| 日本在线视频网址| 日韩av高清在线播放| 国精品**一区二区三区在线蜜桃| 国产一级视频在线观看| 亚洲新中文字幕| 一区中文字幕| 噼里啪啦国语在线观看免费版高清版| 亚洲同性gay激情无套| 手机看片福利在线观看| 国产精品嫩草影院一区二区| 国产字幕视频一区二区| av黄色免费网站| 日韩免费视频线观看| 校园春色亚洲色图| www.欧美黄色| 日本一二三不卡| 天堂v在线观看| 成人久久18免费网站图片| 亚洲欧美日韩综合国产aⅴ|