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

C#中使用單個對象的方法實現(xiàn)Undo/Redo

開發(fā) 后端
本文將告訴我們?nèi)绾卧诓煌膱鼍跋率褂眠@些方法來實現(xiàn)Undo/Redo,并且?guī)椭蠹艺_理解Undo/Redo。以及如何使用單個對象表示變化。

簡介

我們?nèi)绾卧诓煌膱鼍跋率褂眠@些方法來實現(xiàn)Undo/Redo。這些方法是使用單個對象表示變化,命令模式和備忘錄模式。

正如我們所知,Undo/Redo沒有通用的解決方案,而Undo/Redo在每個應(yīng)用程序中非常具體。處于這個原因,在該系列文章的開始部分,將討論如何使用該方法建模任意的應(yīng)用程序,然后展示一個簡單應(yīng)用程序的實現(xiàn)。

關(guān)于Undo/Redo實現(xiàn)的基本思想

正如我們所知,應(yīng)用程序在每次操作后改變其狀態(tài)。當操作應(yīng)用程序時,它的狀態(tài)會發(fā)生改變。所以,若有人想要做撤銷,他不得不回到先前的狀態(tài)。因此,為了能夠回到先前狀態(tài),我們需要在應(yīng)用程序運行時存儲它的狀態(tài)。要支持重做,我們不得不從目前狀態(tài)跳到下一個狀態(tài)。

為了實現(xiàn)Undo/Redo,我們不得不存儲應(yīng)用程序的狀態(tài)并在撤銷時跳到前一個狀態(tài)而在重做時跳到下一個狀態(tài)。因此我們需要維護應(yīng)用程序的狀態(tài)來支持Undo/Redo。在所有三種方法中,應(yīng)用程序狀態(tài)的維護用到了兩個棧。一個棧包含用于撤銷操作的狀態(tài),第二個包含用于重做的狀態(tài)。撤銷操作彈出撤銷棧以獲取前一個狀態(tài)并將其設(shè)置給應(yīng)用程序。同樣的,重做操作彈出重做棧以獲取下一個狀態(tài)并將其設(shè)置給應(yīng)用程序。

現(xiàn)在,我們知道了Undo/Redo的實現(xiàn)操作都是關(guān)于保持應(yīng)用程序每次操作后的狀態(tài)。現(xiàn)在的問題是該方法如何保存狀態(tài)。本方法中,單個操作的改變被保存在一個對象中,有些屬性為該操作作為狀態(tài)是多余的,因為這里,單個對象被用于包含所有類型的動作數(shù)據(jù)。

什么是單個對象表示改變的方法?

首先,我對這是由我命名表示抱歉。這里,單個對象表示了應(yīng)用程序中所有操作的所有改變。因此,當你準備了一個關(guān)于操作更改的類型的對象,在執(zhí)行一次操作后,你僅使用了該對象屬性的子集,而剩余屬性仍舊沒有被使用。例如,你在一個應(yīng)用程序中有兩個操作;它們是高度的改變和寬度的改變。因此,對象類型包含兩個屬性:高度和寬度。當你準備了變化對象,在執(zhí)行高度更改方法后,你僅需設(shè)置變化對象的高度字段,而其他字段仍舊沒有被使用。

如何應(yīng)用單個對象表示變化的方法對任意應(yīng)用程序Undo/Redo操作建模?

單個對象表示變化的方法如何對任意應(yīng)用程序Undo/Redo操作建模將在以下步驟中討論:

步驟1

首先識別出你希望哪些操作能支持Undo/Redo。然后,識別出你將在哪個容器下支持Undo/Redo以及你希望哪些對象支持Undo/Redo。

步驟2

為了進一步處理每個Undo/Redo操作,識別出需要被保存的屬性。

步驟3
然后創(chuàng)建一個類(ChangeRepresentationObject),它包含支持全部操作Undo/Redo的所有屬性。同樣,準備一個動作類型enum,它將代表全部操作。這個動作類型enum是ChangeRepresentationObject類的一部分。

步驟4

然后創(chuàng)建一個名為UndoRedo的類,它包含兩個類型的ChangeRepresentationObject棧。一個用于撤銷操作,一個用于重做操作。該類將實現(xiàn)以下接口:

interface IUndoRedo
{
void Undo(int level);
void Redo(int level);
void InsertObjectforUndoRedo(ChangeRepresentationObject dataobject);
}

步驟5

然后實現(xiàn)具體方法:Undo、 Redo、InsertObjectforUndoRedo。

在每個Undo操作中:

◆首先檢查Undo棧是否為空。

◆如果不是,則彈出一個ChangeRepresentationObject并將其壓入重做棧。

◆檢查動作類型。

◆然后基于動作類型,利用ChangeRepresentationObject的屬性完成撤銷操作。
在每個Redo操作中,你幾乎做與Undo同樣的事。

◆首先檢查Redo棧是否為空。

◆如果不是,彈出一個ChangeRepresentationObject,然后將其壓入撤銷棧。

◆檢查動作類型。

◆然后基于動作的類型,利用ChangeRepresentationObject屬性完成重做操作。
在InsertObjectforUndoRedo操作中,你只要把數(shù)據(jù)對象插入Undo棧并清空Redo棧中。

步驟6

然后,在完成每次操作前,調(diào)用InsertObjectforUndoRedo方法以對所有操作提供Undo/Redo支持。在用戶界面上點擊Undo時,只需調(diào)用UndoRedo類的Undo方法,而在用戶界面上點擊Redo時,只需調(diào)用UndoRedo類的redo方法。

#p#

示例應(yīng)用程序說明

這個示范WPF繪制應(yīng)用程序用來作為結(jié)合Undo/Redo操作的案例。該WPF應(yīng)用程序示例支持四種操作:插入對象、刪除對象、移動對象和調(diào)整對象的尺寸,它還有兩種類型的幾何對象:矩形和多邊形。它使用畫布作為包含這些幾何對象的容器。

現(xiàn)在,在此系列文章中,我們可以看到如何讓這四個操作支持Undo/Redo。在第一部分,使用單個對象表示變化的方法實現(xiàn)。在第二部分,使用命令模式實現(xiàn)而在第三部分,使用備忘錄模式實現(xiàn)。

使用單個對象表示變化的方法實現(xiàn)示范應(yīng)用程序的Undo/Redo

利用單個對象表示變化的方法對示范應(yīng)用程序Undo/Redo的實現(xiàn)將在以下步驟中討論

步驟1

我們將識別出那些需要支持Undo/Redo的操作。這里有四個操作支持Undo/Redo。它們是::插入對象、刪除對象、移動對象和調(diào)整對象的尺寸。我們將對矩形和橢圓支持Undo/Redo,這里的容器是畫布。

步驟2

現(xiàn)在我們將識別出那些進一步處理Undo/Redo所需的保存的參數(shù)。幾何對象移動時其邊距改變,因此要支持對象移動的Undo/Redo,要保存邊距。當對象改變尺寸時,它的高度、寬度和邊距改變。因此為支持對象尺寸調(diào)整的Undo/Redo,我們需要保存高度、寬度和邊距。為了支持插入和刪除的Undo/Redo操作,我們需要保存幾何對象的引用。

步驟3

現(xiàn)在我們得到包含邊距、高度、寬度、動作類型、幾何對象引用的ChangeRepresentationObject以支持所有操作的Undo/Redo。這里的幾何對象引用被保存以便我們在對其進行Undo/Redo時獲取。同樣使動作類型enum代表插入、刪除、移動和調(diào)整尺寸操作。此動作類型enum被用作ChangeRepresentationObject的一部分。

CollapseCopy Code
public enum ActionType
{
Delete = 0,
Move = 1,
Resize = 2,
Insert = 3
}
CollapseCopy Code
public class ChangeRepresentationObject
{
public ActionType Action;
public Point Margin;
public double Width;
public double height;
public FrameworkElement UiElement;
}

這里,已附上使用單個對象表示變化的方法實現(xiàn)Undo/Redo的項目。

步驟4&5

然后我們將包含兩個ChangeRepresentationObject類型的棧的類命名為UndoRedo。一個棧用于撤銷操作而另一個用于重做操作。類的代碼如下:

CollapseCopy Code
public partial class UnDoRedo : IUndoRedo
{
private Stack _UndoActionsCollection =
 new Stack();
private Stack _RedoActionsCollection =
 new Stack();

#region IUndoRedo Members

public void Undo(int level)
{
for (int i = 1; i <= level; i++)
{
if (_UndoActionsCollection.Count == 0) return;

ChangeRepresentationObject Undostruct = _UndoActionsCollection.Pop();
if (Undostruct.Action == ActionType.Delete)
{
Container.Children.Add(Undostruct.UiElement);
this.RedoPushInUnDoForDelete(Undostruct.UiElement);
}
else if (Undostruct.Action == ActionType.Insert)
{
Container.Children.Remove(Undostruct.UiElement);
this.RedoPushInUnDoForInsert(Undostruct.UiElement);
}
else if (Undostruct.Action == ActionType.Resize)
{
if (_UndoActionsCollection.Count != 0)
{
Point previousMarginOfSelectedObject = new Point
 (((FrameworkElement)Undostruct.UiElement).Margin.Left,
((FrameworkElement)Undostruct.UiElement).Margin.Top);
this.RedoPushInUnDoForResize(previousMarginOfSelectedObject,
 Undostruct.UiElement.Width,
Undostruct.UiElement.Height, Undostruct.UiElement);
Undostruct.UiElement.Margin = new Thickness
 (Undostruct.Margin.X, Undostruct.Margin.Y, 0, 0);
Undostruct.UiElement.Height = Undostruct.height;
Undostruct.UiElement.Width = Undostruct.Width;
}
}
else if (Undostruct.Action == ActionType.Move)
{
Point previousMarginOfSelectedObject = new Point
 (((FrameworkElement)Undostruct.UiElement).Margin.Left,
((FrameworkElement)Undostruct.UiElement).Margin.Top);
this.RedoPushInUnDoForMove(previousMarginOfSelectedObject,
 Undostruct.UiElement);
Undostruct.UiElement.Margin = new Thickness
 (Undostruct.Margin.X, Undostruct.Margin.Y, 0, 0);
}
}
}

public void Redo(int level)
{
for (int i = 1; i <= level; i++)
{
if (_RedoActionsCollection.Count == 0) return;

ChangeRepresentationObject Undostruct = _RedoActionsCollection.Pop();
if (Undostruct.Action == ActionType.Delete)
{
Container.Children.Remove(Undostruct.UiElement);
this.PushInUnDoForDelete(Undostruct.UiElement);
}
else if (Undostruct.Action == ActionType.Insert)
{
Container.Children.Add(Undostruct.UiElement);
this.PushInUnDoForInsert(Undostruct.UiElement);
}
else if (Undostruct.Action == ActionType.Resize)
{
Point previousMarginOfSelectedObject = new Point
 (((FrameworkElement)Undostruct.UiElement).Margin.Left,
((FrameworkElement)Undostruct.UiElement).Margin.Top);
this.PushInUnDoForResize(previousMarginOfSelectedObject,
Undostruct.UiElement.Width,
Undostruct.UiElement.Height, Undostruct.UiElement);
Undostruct.UiElement.Margin = new Thickness
 (Undostruct.Margin.X, Undostruct.Margin.Y, 0, 0);
Undostruct.UiElement.Height = Undostruct.height;
Undostruct.UiElement.Width = Undostruct.Width;
}
else if (Undostruct.Action == ActionType.Move)
{
Point previousMarginOfSelectedObject = new Point
 (((FrameworkElement)Undostruct.UiElement).Margin.Left,
((FrameworkElement)Undostruct.UiElement).Margin.Top);
this.PushInUnDoForMove(previousMarginOfSelectedObject,
 Undostruct.UiElement);
Undostruct.UiElement.Margin = new Thickness
(Undostruct.Margin.X, Undostruct.Margin.Y, 0, 0);
}
}
}
public void InsertObjectforUndoRedo(ChangeRepresentationObject dataobject)
{
_UndoActionsCollection.Push(dataobject);_RedoActionsCollection.Clear();
}
 #endregion

步驟6

在完成每個操作前,調(diào)用InsertObjectforUndoRedo方法。當用戶界面上Undo被點擊,我們調(diào)用UndoRedo類的Undo方法,而當用戶界面上Redo被點擊,我們調(diào)用UndoRedo類的redo方法。

這里,我們沒有明確設(shè)置Undo棧和Redo棧的大小,因此,應(yīng)用程序能具有的狀態(tài)數(shù)目取決于系統(tǒng)的內(nèi)存。

使用單個對象表示變化的方法時的變更管理

如果你想要用單個對象表示變化的方法來為新的操作支持Undo/Redo時,你不得不作一些改變。你不得不修改表示變化的對象,動作類型Enum并改變Undo/Redo方法的代碼。所以,它的可維護性很低。

使用單個對象表示變化的方法的優(yōu)缺點

它的優(yōu)點是實現(xiàn)簡單,而不需要知道任何的設(shè)計模式,你就可以實現(xiàn)Undo/Redo。

可維護性很低。代表該方法的對象包含很多額外信息,因為這里,單個對象用來容納所有動作類型的數(shù)據(jù)。例如,對移動而言,我們只需保存移動相關(guān)的數(shù)據(jù),而對調(diào)整尺寸,我們應(yīng)該僅保存該操作相關(guān)的數(shù)據(jù)。所以,我們在保存冗余的數(shù)據(jù)。隨著操作數(shù)目的增加,冗余也在增加。這并不是好的面向?qū)ο蟮脑O(shè)計。

【編輯推薦】

  1. C#實用基礎(chǔ)教程
  2. 如何使用C#代碼實現(xiàn)DataTemplate
  3. 詳解C# 4.0中必選參數(shù)與可選參數(shù)混合的問題
責任編輯:彭凡 來源: ITPUB
相關(guān)推薦

2024-04-26 08:46:38

WPF開發(fā)UndoRedo

2009-04-03 13:20:05

C#擴展方法調(diào)用

2021-01-28 05:14:40

C#接口簽名

2009-08-10 13:34:11

創(chuàng)建C# COM對象

2009-06-18 13:06:59

C#位運算權(quán)限管理

2020-12-31 07:31:10

C# 反射數(shù)據(jù)

2009-08-19 17:00:07

C#實現(xiàn)PrintPa

2009-08-20 14:22:17

C#實現(xiàn) Contro

2009-08-17 09:50:59

C# ping命令

2019-04-23 15:20:26

JavaScript對象前端

2009-09-07 09:36:29

C# DisposeDispose方法

2021-03-07 16:37:52

C#應(yīng)用程序

2024-06-27 12:21:13

2021-02-01 12:36:59

C# Channels存儲

2013-03-15 10:37:08

C#

2009-03-27 10:10:13

c#遠程啟動遠程管理

2009-08-25 14:26:28

C#播放AVI文件

2024-05-16 12:33:37

C#編程指針

2009-08-25 16:54:28

C# RichText

2024-05-21 11:09:17

點贊
收藏

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

91免费电影网站| 九九热线有精品视频99| 久久66热偷产精品| 欧美激情视频给我| yy6080午夜| 欧美暴力调教| 亚洲最大色网站| 欧美一区二区三区电影在线观看| 在线播放精品视频| 在线日韩电影| 色七七影院综合| 艳妇乳肉豪妇荡乳xxx| 麻豆精品蜜桃| 亚洲电影中文字幕在线观看| 清纯唯美一区二区三区| 超碰免费在线97| 天堂在线亚洲视频| 一区二区三区高清| 欧美国产综合视频| 久久久久久免费观看| 曰本一区二区三区视频| 日韩免费观看高清完整版 | 人妻精品一区二区三区| 亚洲欧美偷拍自拍| 亚洲人成伊人成综合网久久久| 一级日本黄色片| 一区二区视频免费完整版观看| 亚洲一区二区在线观看视频 | 欧美日韩人妻精品一区在线| 欧美成人福利| 色哟哟欧美精品| 熟女少妇在线视频播放| 在线黄色网页| 亚洲视频中文字幕| 亚洲视频精品一区| 一区二区三区免费在线| 亚洲一区日本| 久久久综合免费视频| 国产日韩欧美在线观看视频| 欧美在线观看视频一区| 亚洲欧美精品伊人久久| 一女三黑人理论片在线| 久久黄色影视| 色综合天天综合网天天看片| 成人一区二区免费视频| 色呦呦在线免费观看| 不卡一区中文字幕| 99视频在线| 精品人妻aV中文字幕乱码色欲| 蜜臀久久99精品久久久画质超高清| 538国产精品一区二区在线 | 激情欧美日韩一区| 久久6免费高清热精品| 国产真实乱在线更新| 日韩在线欧美| www.亚洲免费视频| 亚洲欧美精品久久| 亚洲最大黄网| 欧美尺度大的性做爰视频| 国产这里有精品| 亚洲无线视频| 91黑丝在线观看| 毛片基地在线观看| 三级欧美韩日大片在线看| 日本欧美在线视频| 亚洲一级视频在线观看| 久久激情综合网| 久久久久久久久91| 日本在线视频免费| 国产日韩欧美| 国产成人综合亚洲| 亚洲网站免费观看| 国产大陆精品国产| 黄色99视频| 91在线公开视频| 国产乱色国产精品免费视频| 日本国产欧美一区二区三区| 神马久久久久久久| 麻豆国产欧美日韩综合精品二区 | 亚洲精品一区二区三区四区| 成人午夜精品一区二区三区| 国产精品久久久久久久久免费| 无码人妻久久一区二区三区不卡| 日本美女一区二区| 成人免费午夜电影| 人妻中文字幕一区| 欧美极品少妇xxxxⅹ高跟鞋| 亚洲高潮无码久久| 小视频免费在线观看| 精品视频999| 国产裸体舞一区二区三区| 992tv国产精品成人影院| 91麻豆精品国产91久久久久久久久| 成人一区二区三区仙踪林| 欧美jizz19性欧美| 日韩在线播放视频| 国产午夜视频在线播放| 日本视频在线一区| 成人精品水蜜桃| 国产女人在线视频| www.欧美.com| 亚洲国产高清国产精品| 毛片在线网址| 欧美日韩精品欧美日韩精品| 黄色激情在线观看| 日韩欧美视频在线播放| 97视频在线观看播放| 一本大道伊人av久久综合| 不卡av免费在线观看| 伊人久久99| 北岛玲一区二区三区| 亚洲综合清纯丝袜自拍| 午夜免费精品视频| 最新日韩一区| 亚洲福利视频在线| 午夜国产小视频| 老司机午夜精品视频| 国产精品麻豆免费版| 欧洲美女少妇精品| 欧洲国内综合视频| 国产精品无码专区| 很黄很黄激情成人| 亚洲aaaaaa| 麻豆系列在线观看| 欧美艳星brazzers| aaaaa级少妇高潮大片免费看| 欧美激情 亚洲a∨综合| 国产精品视频自在线| 四虎电影院在线观看| 久久久久久日产精品| 草草草视频在线观看| 亚洲影视资源| 日韩在线观看免费网站| 69视频免费看| 久久久夜色精品亚洲| 欧洲黄色一级视频| 久久久久影视| 久久男人资源视频| 国产77777| 一区二区三区丝袜| 永久免费看片在线观看| **女人18毛片一区二区| 欧美国产日本高清在线| 91精品中文字幕| 国产精品美日韩| 动漫av免费观看| 国产精品视频一区二区三区四蜜臂| 亚洲3p在线观看| 天天操天天操天天| 精品福利免费观看| 亚洲av无码成人精品国产| 奶水喷射视频一区| 国产日韩精品在线观看| 3p视频在线观看| 欧美伦理视频网站| 国产稀缺精品盗摄盗拍| 韩国三级电影一区二区| 国产91porn| 盗摄系列偷拍视频精品tp| 久久久爽爽爽美女图片| 五月激情婷婷综合| 色综合久久天天| 欧美丰满老妇熟乱xxxxyyy| 日韩av不卡在线观看| 亚洲免费视频一区| 99精品在线免费观看| 久久香蕉国产线看观看av| 精品人妻一区二区三区含羞草 | 韩日视频在线观看| 伦理一区二区三区| 国产91精品在线播放| av中文资源在线| 欧美一区三区四区| 日本三级2019| 国产欧美一区二区精品忘忧草 | 超薄丝袜一区二区| 欧美特黄一级视频| 色婷婷香蕉在线一区二区| 亚洲熟女少妇一区二区| 国产高清久久久| 99久久久无码国产精品6| 国产精品久久久久久久| 国产免费一区二区三区| 精品欧美一区二区三区在线观看 | 无码人妻av一区二区三区波多野 | 亚洲GV成人无码久久精品 | 亚洲跨种族黑人xxx| 亚洲怡红院av| 午夜精品福利视频网站| 91麻豆精品国产91久久综合| 国产精品一二三在| 日韩免费高清在线| 欧美jizzhd精品欧美巨大免费| 精品久久久三级| 色综合久久久| 日本aⅴ大伊香蕉精品视频| 久草免费在线观看| 亚洲欧美精品suv| 国产999久久久| 欧美亚洲日本国产| 日韩少妇裸体做爰视频| 国产一区二区在线观看视频| 欧美激情视频免费看| 水蜜桃精品av一区二区| 久久99精品国产99久久| 国产精品3区| 久久大逼视频| 亚洲欧洲免费视频| 99精品在线看| 欧美性欧美巨大黑白大战| 久久精品国产亚洲AV无码麻豆| 蜜桃一区二区三区在线观看| 日韩中文字幕在线不卡| 精品国产精品国产偷麻豆| 成人做爰66片免费看网站| 91国拍精品国产粉嫩亚洲一区| 久久久久久18| 日本在线观看视频| 亚洲人永久免费| 蜜桃视频久久一区免费观看入口| 欧美日韩精品系列| 国产情侣呻吟对白高潮| 婷婷综合五月天| 久久久久久久久毛片| 中文字幕av一区二区三区免费看 | 日韩伦理在线免费观看| 66国产精品| 亚洲永久一区二区三区在线| 亚洲婷婷伊人| 久久亚洲精品欧美| 另类ts人妖一区二区三区| 不卡视频一区二区| 日韩一二三区| 91夜夜揉人人捏人人添红杏| 巨胸喷奶水www久久久| 国产成人97精品免费看片| 成av人片在线观看www| 欧美激情一区二区三区久久久 | 国产日韩在线视频| 香蕉成人影院| 国产剧情日韩欧美| 精品自拍视频| 国产免费一区二区三区香蕉精| 姬川优奈av一区二区在线电影| 日本视频久久久| 色8久久影院午夜场| 日本免费一区二区三区视频观看| 电影网一区二区| 日韩美女免费视频| 国产精品av一区二区三区| 欧洲一区二区视频| 欧美gay视频| 国产精品视频久| 一级欧美视频| av噜噜色噜噜久久| 加勒比色综合久久久久久久久 | 不卡中文字幕| 五月天色一区| 国产精品毛片一区二区在线看| 在线播放 亚洲| 欧美在线免费| 男女啪啪免费视频网站| 亚洲尤物影院| 日韩肉感妇bbwbbwbbw| 精品一区二区免费视频| 野花视频免费在线观看| eeuss鲁片一区二区三区在线观看| 国产美女视频免费观看下载软件| 91在线观看下载| 亚洲码无人客一区二区三区| 国产精品视频一二三区| 精品亚洲乱码一区二区| 一区二区三区在线播| 日本在线视频免费观看| 欧美在线观看禁18| 国产欧美日韩综合精品一区二区三区| 日韩一级在线观看| 天天摸天天碰天天爽天天弄| 亚洲桃花岛网站| av在线播放观看| 26uuu亚洲国产精品| 久久爱.com| 国产精品视频在线免费观看 | 四虎影院在线免费播放| 欧美日韩在线观看一区二区| 亚洲国产精品久久久久久6q| 亚洲精品影视在线观看| 欧美天天影院| 2021国产精品视频| 成人午夜888| 久久综合中文色婷婷| 国产精品7m凸凹视频分类| 久久久久久久中文| 精品一区二区免费看| 喷水视频在线观看| 国产精品成人免费| 91美女免费看| 欧美一区二区三区四区高清| 青青草免费观看免费视频在线| 久久色精品视频| 偷拍精品精品一区二区三区| 亚洲自拍av在线| 精品国产123区| 久草视频国产在线| 老汉av免费一区二区三区| a天堂视频在线观看| 亚洲色图在线视频| 欧美亚洲精品天堂| 精品美女一区二区| 免费黄色网页在线观看| 热久久免费国产视频| 97超碰成人| 特级西西444| 麻豆免费看一区二区三区| 中文字幕一区二区人妻电影丶| 亚洲欧美一区二区在线观看| a级大片在线观看| 亚洲黄色小说网站| 97超碰国产在线| 亚洲男人天堂2024| 爱啪视频在线观看视频免费| 91免费国产网站| 久久高清精品| 黑人粗进入欧美aaaaa| 91影院在线免费观看| 精品一级少妇久久久久久久| 3atv在线一区二区三区| 北岛玲一区二区三区| 国产成人精品综合| 亚洲a级精品| 久久久久久久中文| a级高清视频欧美日韩| 国产大片中文字幕| 日韩欧美一卡二卡| 日本三级韩国三级欧美三级| 亚洲一区二区中文字幕| 欧美好骚综合网| 色www免费视频| 国产成人在线免费| 国产97免费视频| 91精品国产综合久久久久久久| 色的视频在线免费看| 国产精品欧美日韩久久| 国产精品国模大尺度私拍| 欧美日一区二区三区在线观看国产免| 波多野结衣国产精品| 18成人在线视频| 99re只有精品| 久久99视频精品| 粉嫩av一区二区| koreanbj精品视频一区| 99精品久久只有精品| 国产视频91在线| 亚洲精品一区二三区不卡| se01亚洲视频| 亚洲欧美国产一区二区| 久久99精品国产麻豆婷婷洗澡| 永久免费看片直接| 欧美大胆一级视频| 国产理论在线| 日本在线播放不卡| 欧美jjzz| 精品一区二区三区四区五区六区| 欧美日韩国产专区| 好男人免费精品视频| 国产精品揄拍一区二区| 亚洲精品在线观看91| 欧美日韩免费不卡视频一区二区三区| 欧美成人免费观看视频 | 好吊色一区二区| 欧美中文字幕在线播放| 成人毛片免费看| 91丝袜超薄交口足| 一区二区久久久久久| 风流老熟女一区二区三区| 欧美精品久久久久久久久久| 夜夜躁狠狠躁日日躁2021日韩| av网站在线不卡| 一区二区成人在线| 黄色在线观看网| 亚洲永久在线观看| 老鸭窝毛片一区二区三区| 日本成人精品视频| 精品盗摄一区二区三区| av一区在线| 久草免费福利在线| 欧美高清在线一区| 亚洲精品久久久久avwww潮水| 日韩av电影手机在线| 欧美大片一区| 免费福利视频网站| 精品国产91乱码一区二区三区 | www青青草原| 亚洲欧美自拍一区| 综合视频一区| 欧美午夜aaaaaa免费视频| 亚洲成人激情自拍| 免费看a在线观看| 日本不卡一区| 成人综合婷婷国产精品久久|