精品欧美一区二区三区在线观看 _久久久久国色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.久久免费一区| 欧美精品一区三区| 精品人妻一区二区三区香蕉| 91精品国产经典在线观看| 亚洲精品免费在线观看| 国产精品成人一区二区三区| 夜夜爽妓女8888视频免费观看 | 蜜桃传媒视频麻豆第一区免费观看 | 在线观看麻豆| 不卡电影免费在线播放一区| 国产区精品视频| 91精品国产乱码久久久张津瑜 | 久久久久久夜精品精品免费| 亚洲最大av在线| 免费的毛片视频| 亚洲一级一区| 久久精品视频在线| 亚洲第一页av| 国产美女撒尿一区二区| 污视频在线免费观看网站| 狠狠干狠狠操视频| 97人人模人人爽人人喊38tv| 国新精品乱码一区二区三区18| 国产18无套直看片| 欧美网色网址| 日韩欧美自拍偷拍| 国产福利一区视频| 精品无码在线观看| 欧美特黄色片| 色综合视频一区二区三区高清| 中文久久乱码一区二区| 亚洲综合好骚| 精品国精品自拍自在线| 在线免费视频一区| 精品美女久久久久| 成功精品影院| 日韩一区二区在线观看视频| 黄色一级片免费的| 懂色aⅴ精品一区二区三区| 日韩av密桃| 欧美日韩高清一区| 动漫av免费观看| 欧美7777| 日韩人在线观看| 国产a视频免费观看| 日本不卡1234视频| 精品国产91久久久| jizzjizz国产精品喷水| 激情aⅴ欧美一区二区欲海潮| 亚洲日本青草视频在线怡红院| 在线综合视频网站| 美女隐私在线观看| 亚洲色图丝袜美腿| 国产又粗又爽又黄的视频| 91网址在线观看| 亚洲免费观看高清完整版在线观看熊| 潘金莲一级淫片aaaaa免费看| 国产乱色在线观看| 亚洲一区二区影院| 国产一区二区在线视频播放| 美女高潮视频在线看| 日韩欧美第一页| 亚洲色精品三区二区一区| 毛片电影在线| 欧美在线免费观看亚洲| 激情黄色小视频| 136福利精品导航| 亚洲国产精品久久精品怡红院| 中文字幕一区二区久久人妻网站| 偷拍自拍一区| 色偷偷888欧美精品久久久| 国精产品一区一区二区三区mba| 日韩欧美亚洲另类| 伊人久久国产| 欧美在线免费播放| 特级黄色片视频| 精品久久ai电影| 欧美国产精品v| 国产一区二区三区91| 在线视频观看日韩| 欧美激情久久久久久| 国产性xxxx高清| 老司机午夜精品视频| 国产欧美亚洲视频| 亚洲欧美强伦一区二区| xfplay精品久久| 一级做a爰片久久| 欧美xxxx做受欧美88bbw| 精品久久久久久久中文字幕 | 精品视频资源站| 亚洲一区二区偷拍| 欧美精品中文| 久久精品国产亚洲| 国产又色又爽又黄的| 极品少妇一区二区三区精品视频| 成人片在线免费看| 成人免费在线电影| 亚洲国产精品久久艾草纯爱| 精品久久久久久中文字幕2017| 亚洲第一二区| 亚洲区在线播放| 国产一级片免费看| 日本一不卡视频| 精品久久久久久一区| 免费**毛片在线| 色老汉一区二区三区| 免费黄视频在线观看| 成人aaaa| 国产999精品久久久影片官网| av免费在线不卡| 中文字幕免费一区| www在线观看免费| 国产精品久久久久久久久久辛辛 | 久久综合中文色婷婷| 黄视频在线观看网站| 色偷偷88欧美精品久久久| 丰满饥渴老女人hd| 日韩成人精品一区| 日本不卡视频在线播放| 亚洲av综合色区无码一二三区| 国产亲近乱来精品视频| 欧美三级在线观看视频| 亚洲不卡在线| 欧美成年人视频| 亚洲一区在线观| 国产网站一区二区| 动漫av网站免费观看| 懂色av一区二区| 欧美夫妻性生活视频| 国产情侣av在线| 国产精品成人免费在线| 美女黄色片视频| 精品国产精品| 人人爽久久涩噜噜噜网站| 色欲av永久无码精品无码蜜桃| 亚洲女同ⅹxx女同tv| 天天操精品视频| 国产韩日影视精品| 国产日韩综合一区二区性色av| 欧美91精品久久久久国产性生爱| 图片区日韩欧美亚洲| 性高潮免费视频| 亚洲网站视频| 国产精品国产精品国产专区蜜臀ah| 成人午夜在线影视| 7777精品伊人久久久大香线蕉最新版| 影音先锋男人看片资源| 美国十次了思思久久精品导航 | 国产高清av在线| 色噜噜久久综合| 免费在线观看a视频| 日韩成人一区二区| 亚洲三区四区| www一区二区三区| 欧美成人精品激情在线观看 | 亚洲人成在线电影| 乱子伦一区二区三区| 国产精品入口麻豆九色| 17c国产在线| 欧美福利影院| 岛国一区二区三区高清视频| 嗯啊主人调教在线播放视频| 亚洲免费小视频| 影音先锋黄色网址| 亚洲精品自拍动漫在线| 国产精品果冻传媒| 亚洲欧美久久久| 亚洲国产精品日韩| 久久伊人影院| 性色av一区二区咪爱| 日韩电影在线观看完整版| 欧美日韩一区在线观看| 中文字幕av免费在线观看| 不卡的av中国片| 超碰在线人人爱| 欧美激情一区| 免费观看成人在线| 高清一区二区三区av| 久久免费成人精品视频| 黄色毛片在线观看| 91精品婷婷国产综合久久性色 | 一级黄色录像毛片| 国产精品99久久久久| 国内自拍在线观看| 久久综合99| 国产在线精品一区二区中文| 成人免费av电影| 久国内精品在线| 青青免费在线视频| 911精品国产一区二区在线| 国产精品1234区| 国产精品久久久久久久岛一牛影视| 成人在线短视频| 视频一区欧美日韩| av在线免费观看国产| 欧美日韩伦理| 国产v亚洲v天堂无码| jizz欧美| 7777免费精品视频| a视频在线观看| 亚洲色图35p| www.黄色av| 欧美日韩一区不卡| 久久久久久久黄色片| 亚洲六月丁香色婷婷综合久久 | 日韩一级片免费看| 欧美日韩二区三区| 你懂的国产在线| 一区二区高清在线| 国产免费嫩草影院| 久久老女人爱爱| 深夜视频在线观看| 精品系列免费在线观看| 日韩有码免费视频| 亚洲精品偷拍| 国产一线二线三线女| 希岛爱理av一区二区三区| 日韩精品一线二线三线| 精品在线网站观看| 99国产超薄丝袜足j在线观看 | 日韩视频一区二区三区在线播放| 日韩精品一区不卡| 天天综合日日夜夜精品| 一级aaa毛片| 亚洲一区二区视频在线观看| 乱h高h女3p含苞待放| 国产女同性恋一区二区| 免费黄色在线视频| 成人av网在线| 污污内射在线观看一区二区少妇| 国产白丝网站精品污在线入口| 男人午夜视频在线观看| 精品一区二区三区视频| 亚洲 欧美 另类人妖| 老司机免费视频久久| 色一情一乱一伦一区二区三区日本| 国产模特精品视频久久久久| 国产免费观看高清视频| 日韩视频在线一区二区三区| 人人干视频在线| 亚洲国产专区| 国产资源在线视频| 亚洲女同同性videoxma| 成人精品视频一区二区| 老妇喷水一区二区三区| 国产一级不卡毛片| 日本不卡视频在线观看| 久久精品影视大全| 久久精品免费观看| 奇米777在线| 成人在线视频一区二区| 粉嫩av懂色av蜜臀av分享| 91最新地址在线播放| 亚洲一级中文字幕| 国产亚洲一本大道中文在线| 夫妇露脸对白88av| ...xxx性欧美| a级片在线观看免费| 午夜精品国产更新| 欧美日韩乱国产| 欧美亚洲国产怡红院影院| 在线免费a视频| 欧美一区二视频| 国产露脸国语对白在线| 日韩视频免费直播| 香蕉视频网站在线| 亚洲最新av在线网站| 黄色国产网站在线播放| 欧美精品久久久久久久久久| 热色播在线视频| 国产精品日韩av| 日韩视频1区| 久久一区二区三区欧美亚洲| 欧美精品尤物在线观看| 亚洲中文字幕无码一区二区三区| 亚洲激情国产| 亚洲污视频在线观看| 国产丶欧美丶日本不卡视频| 欧美成人三级伦在线观看| 中文字幕av一区 二区| 久久免费视频播放| 色婷婷综合久久久中文字幕| 99久久精品国产色欲| 亚洲精品成人久久电影| 日本三级视频在线观看| 97久久久免费福利网址| 成人精品一区二区三区电影| 成人国产一区二区| av亚洲在线观看| 好吊色视频988gao在线观看| 久久激情婷婷| 中文字幕人妻无码系列第三区| 久久综合久色欧美综合狠狠| 欧美成人免费看| 在线观看日韩电影| 丁香六月天婷婷| 深夜福利国产精品| 久草在线中文最新视频| 91久久久亚洲精品| 国产精品日韩精品中文字幕| 99在线观看视频免费| 久草这里只有精品视频| 亚洲综合色一区| 亚洲国产cao| 精品国产999久久久免费| 亚洲色图五月天| 色在线视频观看| 91亚洲精品一区| 视频在线不卡免费观看| 能在线观看的av| 成人avav影音| 美女福利视频在线观看| 欧美日本不卡视频| 你懂的免费在线观看视频网站| 久久久久久久久久久免费| 国产精品免费精品自在线观看| 日韩精品成人一区二区在线观看| 亚洲茄子视频| 日韩高清一二三区| 亚洲免费色视频| 91影院在线播放| 337p粉嫩大胆噜噜噜噜噜91av| 九九久久久久久久久激情| 亚洲少妇中文字幕| 日韩性xxx| 亚洲高清在线观看| av软件在线观看| 国产综合久久久久| 操欧美老女人| 男人舔女人下面高潮视频| 99国产精品国产精品毛片| 五月天婷婷网站| 精品国产123| 欧美xxxx做受欧美88bbw| 亚洲自拍另类欧美丝袜| 亚洲精品一区二区妖精| 亚洲一级片网站| 国产精品美女久久久久aⅴ| 伊人久久久久久久久久久久 | 精品理论电影| 欧美精品精品一区| 亚洲国产精品久久久久爰性色| 久久精品久久久久久| 久久亚洲精品人成综合网| 亚洲ai欧洲av| 美女视频一区二区| 国产又粗又长又黄的视频| 欧美色综合天天久久综合精品| 懂色一区二区三区| 国产伊人精品在线| 亚洲精品久久久| 欧美一级大片免费看| 亚洲专区一二三| 日本美女一级片| 5566成人精品视频免费| 精品视频在线观看免费观看| 色偷偷偷综合中文字幕;dd| 爱福利在线视频| 精品国产一区二区三区日日嗨| 国产偷自视频区视频一区二区| 午夜理伦三级做爰电影| 日本韩国精品一区二区在线观看| 国产69精品久久app免费版| 国产日韩欧美在线观看| 你懂的国产精品永久在线| 日韩成人av一区二区| 日韩人在线观看| 黄网站在线播放| 国产伦精品一区二区三区视频黑人| 国产免费成人| 黄色免费一级视频| 欧美一级理论性理论a| av福利导福航大全在线| 欧美一区二区三区四区五区六区 | 国产精品久久久久久久久免费| 日韩在线观看| zjzjzjzjzj亚洲女人| 色激情天天射综合网| 成人ww免费完整版在线观看| 国产一区二区视频在线免费观看| 丝瓜av网站精品一区二区| 老熟妇高潮一区二区三区| 日韩大片在线观看视频| 欧美动物xxx| 狠狠噜天天噜日日噜| 91麻豆国产在线观看| 91精品国产乱码久久久| 91精品国产91久久久久久不卡| 999久久久国产精品| 理论片大全免费理伦片| 欧美午夜寂寞影院| 老牛影视精品| 中文字幕一区二区三区四区五区人| 91在线丨porny丨国产| 国产精品人妻一区二区三区| 奇米4444一区二区三区|