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

軟件項目架構簡明進化史

開發 架構
這里,作者將跟我們分享一個局部架構的進化過程。這一演進過程,歡迎大家來討論和分析。

  1引言

  在標題的取名上,不敢說頗費心機,也算得上花費了一點功夫的。首先想到的是“架構設計過程”,又覺得是不是太大了,因為例子比較局部,不是很完整。叫做“結構變化過程”可能更好點。但是又怕名字取的小氣了,進來的人少,參與討論的就更少了,最終還是取了這個有點忽悠人的標題“架構演進”。

  今天的這個架構演進,使用系統中一個局部的實例進行推導和演進,一起來觀察一下,架構是如何不滿足需求的?架構如何演進?更好的架構應該具備哪些條件?有沒有更好的呢?

  業務場景

圖1 業務場景圖

  從上圖可以看出,就是一個電子商務網站常見的支付、支付的后續處理,這樣一個業務場景。支持多種支付方式,目前包括銀聯、支付寶,還有平臺賬戶。平臺賬戶就是注冊用戶將資金存儲在平臺為用戶建立并維護的一個賬戶里,購買平臺的產品,可以使用平臺賬戶中的資金進行支付。

  2業務流程

  首先用戶選擇商品。

  下單,進行支付。

  選擇支付方式。

  使用相應支付方式進行支付。第三方支付,會跳轉到第三方的支付頁面進行支付。

  平臺進行支付的后續處理,包括成功之后的修改狀態等,還包括失敗之后的記錄標記等。

  第三方的支付,在打開第三方支付界面的時候,會告訴它一個平臺的回調地址,支付之后,通過回調地址接收第三方支付的結果,然后進行后續處理。使用平臺賬戶支付,就直接進行后續處理就可以了。

  當然,這其中還會有一些細節,不在我們的討論范圍。例如:使用平臺賬戶進行支付,判斷賬戶金額是否充足。使用第三方支付,是否記錄第三方支付的完整過程,以及完整的支付流程。等等具體的業務細節均不在今天的討論范圍。

  3初級架構-用存儲過程搞定它

  回調地址接收兩個參數,一個是訂單編號,一個是標志。標志說明是成功還是失敗,或者是更加詳細的信息。

  1.   CREATE PROCEDURE Proc_PaymentHandle  
  2.   @OrderSeqNo VARCHAR(36), --訂單編號  
  3.   @ReturnCode VARCHAR(10), --返回狀態碼  
  4.   @PaymentManner CHAR(1) --支付方式:1銀聯,2支付寶,3平臺賬戶  
  5.   AS  
  6.   BEGIN  
  7.   IF(@PaymentManner='1')  
  8.   BEGIN  
  9.   --更新訂單狀態  
  10.   --更新銀聯支付信息  
  11.   RETURN;  
  12.   END  
  13.   ELSE IF(@PaymentManner='2')  
  14.   BEGIN  
  15.   --更新訂單狀態  
  16.   --更新支付寶支付信息  
  17.   RETURN;  
  18.   END  
  19.   ELSE IF(@PaymentManner='3')  
  20.   BEGIN  
  21.   --更新定的狀態  
  22.   --更新平臺賬戶支付信息  
  23.   RETURN;  
  24.   END  
  25. END 

  配合一段C#代碼,判斷一下支付方式,然后給存儲過程傳遞參數。這樣寫的話,上面的這個存儲過程很容易就超過1k行了,相信大家也寫過1k行以上的存儲過程,也維護過這樣的存儲過程,知道個中的酸甜苦辣。

  如果說那一天我們增加了一種支付方式,需要修改的地方包括哪些呢?

  界面要修改,存儲過程要打開修改,調用的C#代碼要修改。真是有點麻煩,最主要的是容易改錯了,誤改了不應該動的地方才是最要命的。好吧,我們簡單分離一下。每種支付方式一個存儲過程,把對于支付方式的判斷放在代碼中,每種支付對應一個代碼中的方法。這樣需要增加一種的話,只要改改支付方式判斷的代碼,然后重新寫一個存儲過程,重新寫一個方法調用一下新的存儲過程就可以了。可是還有一個問題,更新訂單狀態好像大家都在做,如果哪一些還需要加一些大家都需要做的事情呢?或者說修改一些大家都需要做的事情的細節?又或者說某兩個支付方式需要增加一個處理流程呢?打開存儲過程,狂修改吧!!!!

  存儲過程有幾個不便利的地方:

  調試不方便

  測試不方便

  代碼不能折疊,多了之后要拖動滾動條才能找得到

  邏輯運算、大規模計算是存儲過程的弱項

  存儲過程的優勢至少也有一個,就是修改之后,馬上可以見到效果。不用編譯。

  4中級架構-在代碼中分離對每種信息的更新

  之前的架構代碼中有很多的重復地方,例如:對于訂單信息的更新。如何把重復降低呢?降低重復也就集中了代碼,集中了將來也好維護。而且把它分離出來,獨立出來,好像更好點,在需要的地方調用就可以了。如果需要變更訂單的更新細節,只要修改一下更新細節就可以了,不需要動支付的代碼。減小犯錯誤的概率。

  首先,將各種更新信息獨立出來。

  1.   public class OrderRepository2  
  2.   {  
  3.   public void UpdateState()  
  4.   { throw new System.Exception(); }  
  5.   }  
  6.   public class PlatformAccountRepository2  
  7.   {  
  8.   public void Update()  
  9.   { throw new System.Exception(); }  
  10.   }  
  11.   public class ZhifubaoRepository2  
  12.   {  
  13.   public void Update()  
  14.   { throw new System.Exception(); }  
  15.  }  
  16.  public class YinlianRepository2  
  17.   {  
  18.   public void Update()  
  19.   { throw new System.Exception(); }  
  20.   } 

  使用下面的方法進行支付的后續處理。

  1.   public void HandlePaymentResult(PaymentManner2 paymentManner, string orderSeqNo)  
  2.   {  
  3.   switch (paymentManner)  
  4.   {  
  5.   case PaymentManner2.PlatformAccount :  
  6.   var platformService = new PlatformAccountPaymentResultHandleService2();  
  7.   platformService.Handle(orderSeqNo);  
  8.   break;  
  9.   case PaymentManner2.Yinlian :  
  10.   var yinlianService = new YinlianPaymentResultHandleService2();  
  11.   yinlianService.Handle(orderSeqNo);  
  12.   break;  
  13.   case PaymentManner2.Zhifubao :  
  14.   var zhifubaoService = new ZhifubaoPaymentResultHandleService2();  
  15.   zhifubaoService.Handle(orderSeqNo);  
  16.   break;  
  17.   }  
  18.   } public enum PaymentManner2  
  19.   {  
  20.   Zhifubao,  
  21.   Yinlian,  
  22.   PlatformAccount  
  23.   }  
  24.   public class ZhifubaoPaymentResultHandleService2  
  25.   {  
  26.   private OrderRepository2 _orderManagement;  
  27.   private ZhifubaoRepository2 _zhifubaoManagement;  
  28.   public void Handle(string orderSeqNo)  
  29.   {  
  30.   using (TransactionScope scope = new TransactionScope())  
  31.   {  
  32.   _orderManagement.UpdateState();  
  33.   this._zhifubaoManagement.Update();  
  34.   scope.Complete();  
  35.   }  
  36.   }  
  37.   }  
  38.   public class YinlianPaymentResultHandleService2  
  39.   {  
  40.   private OrderRepository2 _orderManagement;  
  41.   private YinlianRepository2 _yinlianManagement;  
  42.   public void Handle(string orderSeqNo)  
  43.   {  
  44.   using (TransactionScope scope = new TransactionScope())  
  45.   {  
  46.   this._orderManagement.UpdateState();  
  47.   this._yinlianManagement.Update();  
  48.   scope.Complete();  
  49.   }  
  50.   }  
  51.   }  
  52.   public class PlatformAccountPaymentResultHandleService2  
  53.   {  
  54.   private OrderRepository2 _orderManagement;  
  55.   private PlatformAccountRepository2 _platformAccountManagement;  
  56.   public void Handle(string orderSeqNo)  
  57.   {  
  58.   using (TransactionScope scope = new TransactionScope())  
  59.   {  
  60.   this._orderManagement.UpdateState();  
  61.   this._platformAccountManagement.Update();  
  62.   scope.Complete();  
  63.   }  
  64.   }  
  65.   } 

  增加支付方式的話,新建一個HandleService類,寫一些處理代碼,然后在public void HandlePaymentResult(PaymentManner2 paymentManner, string orderSeqNo)方法的switch中增加一個case就可以了。

  但是頁面的可選支付方式還是寫死了,沒有動態的變化,支付方式是否可以動態配置呢?而且可以方便的測試呢?例如:雖然我還沒有銀聯的接口,但是我想測試一些,銀聯支付之后平臺的處理是否正確,該更新的信息是否都更新了呢?沒有銀聯的接口,是不是就不能做了呢?有沒有辦法解決呢?

  答案是:有。

  還有就是上面的switch。。。case,好像會很長,也很丑,這個地方能否改進呢?很多人在學習了重構之后,會提出很多的方法來解決這個問題,我們再后面也一塊來解決一下。

  5高級架構-少用存儲過程處理業務的靈活架構

  我們的高級架構有幾個目標

  減少存儲過程中的業務邏輯,讓存儲過程更加純粹的做事,做它擅長的事情。

  可以靈活的增加或者減少支付方式。達到在增加或者減少支付方式的時候,盡量少的修改代碼,盡量減少依賴。減少支付對于支付方式的依賴,支付方式對于后續處理的依賴。

  代碼結構更加清晰。

  為了達到上面的幾個目標,計劃獨立幾個部分。

  支付方式的管理。

  每一種支付方式的處理過程。這個在中級架構里面已經做的差不多了,這里會做的更好一點,抽象這個支付處理過程。

  還有就是要隱藏支付方式和具體的支付方式處理過程映射代碼。具體的支付方式指的是:銀聯或者是支付寶這種具體的一種支付方式。目的就是讓對于支付訂單的處理獨立化,固定化,支持變化。

  5.1支付方式的管理

  1.   public enum PaymentManner1{  
  2.   Zhifubao,  
  3.   Yinlian,  
  4.   PlatformAccount  
  5.   }  
  6.   public class PaymentMannerParams  
  7.   {  
  8.   /// <summary>  
  9.   /// 地址還是內部方法  
  10.   /// </summary>  
  11.   public UriOrFunction UriOrFunction { getset; }  
  12.   /// <summary>  
  13.   /// 地址  
  14.   /// </summary>  
  15.   public string Uri { getset; }  
  16.   /// <summary>  
  17.   /// 方法名  
  18.   /// </summary>  
  19.   public string FunctionName { getset; }  
  20.   enum UriOrFunction  
  21.   {  
  22.   Uri,  
  23.   Function  
  24.   }  
  25.   }  
  26.   public class PaymentMannerManagement1  
  27.  {  
  28.   public Dictionary<PaymentManner1, PaymentMannerParams >FindAvailableManner(decimal moneyOfPay)  
  29.   {  
  30.   throw new System.Exception();  
  31.   }  
  32.   } 

  通過FindAvailableManner方法獲取支付方式。每種支付方式PaymentManner,都帶有一個參數實體PaymentMannerParams,里面的UriOrFunction來決定是通過網頁還是內部方法來支付,Uri就跳轉到Uri就可以了,Function就調用FunctionName中的方法就可以了。支付的時候用下面的Pay先獲取支付方式信息,然后根據每種支付方式的參數來決定具體的支付。

  1.   public class OrderManagement1  
  2.   {  
  3.   public void Pay(decimal money)  
  4.   {  
  5.   var manner= new PaymentMannerManagement1().FindAvailableManner(money);  
  6.   //后續支付  
  7.   }  
  8.   } 

  之前說的,如果銀聯還沒有接口,或者接口暫時不能用了,想測試一下后續的處理,就可以將銀聯這種Manner的UriOrFunction設置為Function,現用內部的方法來測試后續的處理是否正確。等可以用的時候,在變更為Uri就可以了。

  5.2支付過程的抽象

  通過建立支付處理的接口,將支付處理的代碼抽象成下面的樣子。

  1.   public class Service1  
  2.   {  
  3.   public void HandlePaymentResult(PaymentManner1 paymentManner,string orderSeqNo)  
  4.   {  
  5.   IPaymentResultHandleService1 handleService = PaymentResultHandleServiceFactory1.GetService(paymentManner);  
  6.   handleService.Handle(orderSeqNo);  
  7.   }  
  8.   } 

  這個處理的代碼,原則來說以后都不需要修改了。后面要做的就是定義一種新的支付方式枚舉量,然后實現IPaymentResultHandleService1 接口,寫一些處理的代碼就可以了。

  5.3完整代碼using System;

  1.   using System.Collections.Generic;  
  2.   using System.Linq;  
  3.   using System.Text;  
  4.   using System.Transactions;  
  5.   namespace ConsoleApplication1  
  6.  {  
  7.   public class Service1  
  8.   {  
  9.   public void HandlePaymentResult(PaymentManner1 paymentManner,string orderSeqNo)  
  10.   {  
  11.   IPaymentResultHandleService1 handleService = PaymentResultHandleServiceFactory1.GetService(paymentManner);  
  12.   handleService.Handle(orderSeqNo);  
  13.   }  
  14.   }  
  15.   public class OrderManagement1  
  16.   {  
  17.   public void Pay(decimal money)  
  18.   {  
  19.   var manner= new PaymentMannerManagement1().FindAvailableManner(money);  
  20.   //后續支付  
  21.   }  
  22.   }  
  23.   public enum PaymentManner1  
  24.   {  
  25.   Zhifubao,  
  26.   Yinlian,  
  27.   PlatformAccount  
  28.   }  
  29.   public class PaymentMannerParams  
  30.   {  
  31.   /// <summary>  
  32.   /// 地址還是內部方法  
  33.   /// </summary>  
  34.   public UriOrFunction UriOrFunction { getset; }  
  35.   /// <summary>  
  36.   /// 地址  
  37.   /// </summary>  
  38.   public string Uri { getset; }  
  39.   /// <summary>  
  40.   /// 方法名  
  41.   /// </summary>  
  42.   public string FunctionName { getset; }  
  43.   enum UriOrFunction  
  44.   {  
  45.   Uri,  
  46.   Function  
  47.   }  
  48.   }  
  49.   public class PaymentMannerManagement1  
  50.   {  
  51.   public Dictionary<PaymentManner1, PaymentMannerParams >FindAvailableManner(decimal moneyOfPay)  
  52.   {  
  53.   throw new System.Exception();  
  54.   }  
  55.   }  
  56.   public class PaymentResultHandleServiceFactory1  
  57.   {  
  58.   private static PaymentResultHandleServiceFactory1()  
  59.   {  
  60.   _serviceMap = new Dictionary<PaymentManner1, IPaymentResultHandleService1>();  
  61.   _serviceMap.Add(PaymentManner1.PlatformAccount, new PlatformAccountPaymentResultHandleService1());  
  62.   _serviceMap.Add(PaymentManner1.Yinlian, new YinlianPaymentResultHandleService1());  
  63.   _serviceMap.Add(PaymentManner1.Zhifubao,new ZhifubaoPaymentResultHandleService1());  
  64.   }  
  65.   private static Dictionary<PaymentManner1 , IPaymentResultHandleService1> _serviceMap;  
  66.   public static IPaymentResultHandleService1 GetService(PaymentManner1 paymentManner )  
  67.   {  
  68.   return _serviceMap[paymentManner];  
  69.   }  
  70.   }  
  71.   public interface IPaymentResultHandleService1  
  72.   {  
  73.   void Handle(string orderSeqNo);  
  74.   }  
  75.   public class ZhifubaoPaymentResultHandleService1:IPaymentResultHandleService1  
  76.   {  
  77.   private OrderRepository1 _orderManagement;  
  78.   private ZhifubaoRepository1 _zhifubaoManagement;  
  79.   public void Handle(string orderSeqNo)  
  80.   {  
  81.   using (TransactionScope scope = new TransactionScope())  
  82.   {  
  83.   _orderManagement.UpdateState();  
  84.  this._zhifubaoManagement.Update();  
  85.  scope.Complete();  
  86.   }  
  87.   }  
  88.   }  
  89.   public class YinlianPaymentResultHandleService1 : IPaymentResultHandleService1  
  90.  {  
  91.   private OrderRepository1 _orderManagement;  
  92.   private YinlianRepository1 _yinlianManagement;  
  93.   public void Handle(string orderSeqNo)  
  94.   {  
  95.   using (TransactionScope scope = new TransactionScope())  
  96.   {  
  97.   this._orderManagement.UpdateState();  
  98.   this._yinlianManagement.Update();  
  99.   scope.Complete();  
  100.   }  
  101.   }  
  102.   }  
  103.   public class PlatformAccountPaymentResultHandleService1:IPaymentResultHandleService1  
  104.   {  
  105.   private OrderRepository1 _orderManagement;  
  106.   private PlatformAccountRepository1 _platformAccountManagement;  
  107.   public void Handle(string orderSeqNo)  
  108.   {  
  109.   using (TransactionScope scope = new TransactionScope())  
  110.   {  
  111.   this._orderManagement.UpdateState();  
  112.   this._platformAccountManagement.Update();  
  113.   scope.Complete();  
  114.   }  
  115.   }  
  116.   }  
  117.   public class OrderRepository1  
  118.   {  
  119.   public void UpdateState()  
  120.   { throw new System.Exception(); }  
  121.   }  
  122.   public class PlatformAccountRepository1  
  123.   {  
  124.   public void Update()  
  125.  { throw new System.Exception(); }  
  126.  }  
  127.   public class ZhifubaoRepository1  
  128.   {  
  129.  public void Update()  
  130.  { throw new System.Exception(); }  
  131.   }  
  132.   public class YinlianRepository1  
  133.   {  
  134.   public void Update()  
  135.   { throw new System.Exception(); }  
  136.   }  
  137.   } 

  6總結

  類的依賴最好使用抽象,避免具體類的直接引用。

  盡量不要再存儲過程中處理業務,在系統越做越大,你會越來越贊同我的說法。原因至少兩點:1維護累死人,2數據庫不擅長數值計算和處理。

  職責單一,功能獨立,代碼分離。

原文鏈接:http://www.cnblogs.com/virusswb/archive/2011/08/31/2160708.html

【編輯推薦】

  1. 淺析淘寶數據魔方技術架構
  2. 淺析.NET設計架構十條箴言
  3. 揭秘Google+技術架構
  4. 揭秘新版SkyDrive架構的幕后
  5. 97條架構師須知
責任編輯:彭凡 來源: 博客園
相關推薦

2011-12-21 16:44:00

信息圖手機進化史

2014-09-01 16:29:34

2018-08-22 17:58:01

數據平臺數據倉庫架構

2011-11-03 15:25:07

Android

2010-07-27 14:04:52

2011-11-29 09:54:20

Google進化史

2018-07-19 08:54:48

微服務架構Java

2010-04-07 14:54:20

Unix操作系統

2018-03-23 12:20:25

數據中心網絡數據

2024-09-21 10:43:15

數據技術信息

2010-01-21 16:08:26

C++語言

2010-10-09 14:46:20

2025-03-17 11:57:38

2020-11-23 10:35:52

Emotet

2013-06-24 09:18:05

2019-06-19 15:54:12

Redis緩存內存

2014-08-13 10:31:26

Windows操作系統

2011-11-04 15:58:52

手機操作系統進化史

2022-03-25 14:01:20

元宇宙虛擬世界進化

2019-08-29 08:13:28

點贊
收藏

51CTO技術棧公眾號

av毛片在线| 青青艹在线观看| 三级精品视频| 在线视频观看一区| 正义之心1992免费观看全集完整版| 国产一区二区女内射| 欧美va天堂| 亚洲毛片在线看| 不卡的av中文字幕| 后进极品白嫩翘臀在线播放| 久久久噜噜噜久久人人看| 国产精品视频不卡| 国产亚洲精品女人久久久久久| 亚洲国产最新| 日韩一级免费观看| 免费在线激情视频| 免费的黄网站在线观看| 成人av高清在线| 91美女片黄在线观看游戏| 日韩av无码中文字幕| 欧美第一精品| 亚洲女人被黑人巨大进入| 亚洲热在线视频| 亚洲精品555| 亚洲午夜久久久久中文字幕久| 日韩激情视频| 天堂网www中文在线| 九色porny丨国产精品| 456亚洲影院| 男人的天堂久久久| 久草成人资源| 亚洲精品久久久久久久久久久久| 日本一二三四区视频| 三级成人在线| 狠狠色噜噜狠狠狠狠97| 污污污污污污www网站免费| 国产精品二线| 久久色.com| 久久精品ww人人做人人爽| 超碰在线播放97| 国产一区二区在线影院| 国产精品亚洲网站| 波多野结衣av无码| 美女爽到呻吟久久久久| 97高清免费视频| 青青草在线观看视频| 色喇叭免费久久综合网| 亚洲精品美女在线观看播放| 91视频在线免费| 欧美经典一区| 日韩一区二区免费视频| 中文av字幕在线观看| 九色成人搞黄网站| 欧美在线三级电影| 青青草av网站| 美女网站视频一区| 在线观看网站黄不卡| 日本一本二本在线观看| 中文字幕乱码在线播放| 天天综合色天天综合| 成人午夜免费在线| 国产剧情av在线播放| 亚洲成a天堂v人片| 成人在线观看你懂的| 国产高清在线a视频大全| 夜夜揉揉日日人人青青一国产精品| 在线观看欧美亚洲| 免费在线看黄| 亚洲免费观看高清完整| 无码人妻精品一区二区蜜桃百度| 色图在线观看| 欧美日韩国产丝袜另类| 成人羞羞国产免费网站| 日韩欧美少妇| 欧美精品在线观看一区二区| 精品国产乱码久久久久久1区二区| 精品一区二区三区视频在线播放| 日韩久久久久久| 波多野结衣影院| 欧美美女在线| 久久偷看各类女兵18女厕嘘嘘| 久久久久久久久毛片| 亚洲一区二区日韩| 久久久久久有精品国产| 少妇高潮av久久久久久| 毛片av中文字幕一区二区| 亚洲综合中文字幕在线观看| 日韩一区二区三区在线观看视频| 国产亚洲综合色| 热这里只有精品| 成人免费网站观看| 色婷婷久久久亚洲一区二区三区 | 欧美日韩日本视频| 天堂av.com| 偷拍自拍一区| 超碰精品一区二区三区乱码| 国产香蕉视频在线| 久久er精品视频| 国产亚洲精品自在久久| av在线1区2区| 午夜精品久久久久久久| 精品久久久久久中文字幕2017| 经典三级久久| 国产午夜精品一区二区三区| 久久精品一级片| 免费在线观看不卡| 精品不卡一区二区三区| 91大神xh98hx在线播放| 午夜成人免费电影| 精品国产乱码久久久久久1区二区| 要久久电视剧全集免费| 免费av一区二区| 国产成人精品一区二区色戒| 成人高清免费观看| 免费看av软件| 桃子视频成人app| 精品播放一区二区| 亚洲欧美精品aaaaaa片| 视频一区二区中文字幕| 国产精品久久波多野结衣| 日本中文字幕电影在线免费观看| 精品免费在线观看| 少妇伦子伦精品无吗| 欧美电影免费播放| 国产成人精品国内自产拍免费看| 色欲av永久无码精品无码蜜桃 | 日本少妇毛茸茸高潮| 久久精品国产第一区二区三区| 精品国产电影| 黄色美女视频在线观看| 日韩一级二级三级精品视频| 国产精品理论在线| 久久精品亚洲| 久久九九视频| 欧美a级在线观看| 精品国产免费人成在线观看| 欧美三级日本三级| 韩国成人在线视频| 一区二区视频在线免费| 精品123区| 国产一区二区黄| 无码视频在线观看| 久久欧美中文字幕| a在线视频观看| 欧美福利在线播放网址导航| 97视频在线观看免费高清完整版在线观看| 99精品视频免费看| 亚洲人成精品久久久久| 爽爽爽在线观看| 亚洲啊v在线观看| 成人激情视频在线观看| 又爽又大又黄a级毛片在线视频| 欧美日韩性视频在线| 99久久国产精| 免费日韩av片| 欧美在线日韩精品| 日韩一区精品| 久久午夜a级毛片| 国产富婆一级全黄大片| 一区二区成人在线视频| 色悠悠在线视频| 亚洲精品色图| 欧美亚洲丝袜| 成人av集中营| 久热精品在线视频| 精品人妻一区二区三区三区四区| 一区二区三区欧美久久| 国产清纯白嫩初高中在线观看性色| 欧美亚韩一区| 久久久久国产精品视频| 午夜日韩成人影院| 中文字幕一区电影| 99精品国产99久久久久久97| 亚洲午夜在线视频| 性欧美丰满熟妇xxxx性仙踪林| 久久婷婷影院| 特级毛片在线免费观看| 亚洲午夜免费| 欧美亚洲视频在线看网址| 国产精品视频一区二区久久| 欧美一区二区精品久久911| 九九视频免费看| 久久亚洲私人国产精品va媚药| 欧美亚洲日本在线观看| 91精品国产91久久综合 | 国产亚洲一区二区三区啪| 国产精品自拍偷拍视频| 日皮视频在线观看| 亚洲视频777| 99精品免费观看| 色偷偷久久人人79超碰人人澡| 欧美a级片免费看| 99久久久久久| 欧美激情国内自拍| 久久久久久久欧美精品| 日韩精品第1页| 一本久久青青| 成人av免费电影| 99只有精品| 久久乐国产精品| 日本黄色片在线观看| 亚洲国产成人爱av在线播放| 亚洲无码精品国产| 偷窥少妇高潮呻吟av久久免费| 精品视频第一页| 96av麻豆蜜桃一区二区| 91精品999| 久久成人国产| 日韩 欧美 视频| 日韩系列欧美系列| 久久一区免费| 亚洲精选av| 国产在线久久久| 超碰一区二区| 性欧美xxxx交| 伊人在我在线看导航| 中文字幕亚洲情99在线| 香蕉国产在线视频| 日韩欧美第一区| 国产又粗又猛又爽又黄的视频一| 欧美午夜丰满在线18影院| 欧美精品一区二区成人| 国产精品国产三级国产aⅴ入口 | 精品久久久久久| 欧美日韩人妻精品一区二区三区| 久久精品亚洲一区二区三区浴池| 日本一区二区免费视频| 激情综合五月婷婷| 精品亚洲一区二区三区四区| 天堂一区二区在线免费观看| 奇米影视亚洲色图| 国产中文一区| 欧美一二三不卡| 中文精品久久| 欧美日韩视频免费在线观看| 青青草国产成人a∨下载安卓| 欧美伦理一区二区| 特黄特色欧美大片| 国产在线欧美日韩| 免费成人三级| 国产亚洲一区二区三区在线播放| 日韩精品中文字幕一区二区 | 97久久伊人激情网| 9999热视频在线观看| 久久久久久18| 成人免费图片免费观看| 97精品国产97久久久久久春色 | 国产精品日韩一区| 欧美日韩五区| 国产欧美婷婷中文| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 亚洲av无码国产精品永久一区| 91精品国产91综合久久蜜臀| av中文字幕第一页| 欧美videos中文字幕| 亚洲欧美激情在线观看| 亚洲第一福利网站| 少妇性bbb搡bbb爽爽爽欧美| 亚洲精品在线视频| 国产在线网站| 精品国产一区久久久| 国产在线看片| 国产69精品久久久久9| 国产资源在线观看入口av| 欧美亚洲视频在线观看| 97成人超碰| 亚洲在线视频观看| 激情小说亚洲色图| 茄子视频成人在线观看| 日韩免费av| 中文字幕乱码免费| 亚洲黑丝一区二区| 99视频精品免费| 国产一区91精品张津瑜| 欧美xxxxx精品| 国产亚洲一区二区三区| 亚洲视频重口味| 亚洲国产成人tv| 中文 欧美 日韩| 日韩视频一区二区三区| 午夜激情在线视频| 丝袜美腿精品国产二区| www在线看| 国产精品视频一区二区三区四| 欧美黄视频在线观看| 免费看成人片| 一区二区三区中文| 亚洲精品无码久久久久久| 久久精品国产一区二区| 欧美日韩人妻精品一区在线| 国产欧美久久久精品影院 | 欧美特级www| 国产精品亚洲lv粉色| 亚洲精品大尺度| 伊人免费在线| 68精品久久久久久欧美 | 日本一区中文字幕 | 久久久久久久久一| 国产精品丝袜一区二区| 精品日韩中文字幕| 国产精品国产一区二区三区四区 | 超碰在线最新网址| 国产精品久久久亚洲| japanese色系久久精品| 婷婷四月色综合| 国产精品入口| 欧美日韩一区二区区| 国产日产精品一区| 国产精品成人免费一区二区视频| 欧美三级一区二区| 香港三日本三级少妇66| 精品中文字幕在线观看| 国产精品久久久久久吹潮| 精品国产二区在线| 欧美激情第8页| 中文字幕剧情在线观看| 中文字幕不卡在线| 精品人妻一区二区三区免费看| 日韩欧美国产一区二区三区| 91精品大全| 日韩av电影手机在线| 免费成人三级| 国产96在线 | 亚洲| 国产精品66部| 国产大片免费看| 欧美精品乱码久久久久久按摩| 国产www.大片在线| 欧洲亚洲在线视频| 林ゆな中文字幕一区二区| 日韩在线视频在线| 国产麻豆一精品一av一免费| 久久久免费看片| 在线日韩av片| 久香视频在线观看| 日本老师69xxx| 欧美女王vk| 88av.com| 国产肉丝袜一区二区| 69成人免费视频| 亚洲精品一区二三区不卡| 激情黄产视频在线免费观看| 国产一区免费观看| 中文久久精品| 黄色工厂在线观看| 日韩欧美综合在线视频| 九色视频成人自拍| 国产精品91久久| 成人免费在线观看av| 五月婷婷激情久久| 国产精品久久一卡二卡| 伊人亚洲综合网| 精品国内自产拍在线观看| 91麻豆精品国产综合久久久 | 成人爽a毛片一区二区免费| 国产高潮国产高潮久久久91| 日韩欧美国产综合| 不卡av免费观看| 蜜桃传媒视频麻豆第一区免费观看| 亚洲一区成人| 在线国产视频一区| 欧美三级三级三级| a视频在线播放| 国产精品我不卡| 久久精品日产第一区二区| 一本在线免费视频| 欧美一级一区二区| 6699嫩草久久久精品影院| 美女视频久久| 麻豆成人av在线| 激情综合网五月婷婷| 亚洲精品电影在线| 色天使综合视频| 亚洲av综合色区| 91丝袜高跟美女视频| 亚洲婷婷久久综合| 久久高清视频免费| 久久久久高潮毛片免费全部播放| 日韩一级在线免费观看| 中文字幕制服丝袜一区二区三区 | 亚洲免费视频网站| 成人精品高清在线视频| 亚洲精品国产suv一区88| 99国产欧美另类久久久精品| 亚洲精品91天天久久人人| 久久综合免费视频影院| 久久精品66| 超碰人人草人人| 欧美日韩另类视频| 免费a在线看| 欧美日韩成人一区二区三区 | 中国黄色a级片| 91.麻豆视频| 亚洲精品福利电影| 日韩最新中文字幕| 久久蜜桃一区二区| 国产高清第一页| 国产精品人成电影在线观看| 亚洲国产91| 老熟妇高潮一区二区三区| 亚洲美女福利视频网站|