日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 常用设计模式

發布時間:2025/3/15 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 常用设计模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

*1、工廠模式:簡單工廠模式、工廠方法模式、抽象工廠模式

1)、簡單工廠模式:主要特點是需要在工廠類中做判斷,從而創造相應的產品,當增加新產品時,需要修改工廠類。

#include "iostream" using namespace std;typedef enum {T80 = 1,T99 }TankType;class Tank { public:virtual void message() = 0; };class Tank80 :public Tank { public:void message(){cout << "Tank80" << endl;} };class Tank99 :public Tank { public:void message(){printf("T99");cout << "Tank99" << endl;} };class TankFactory { public:Tank* createTank(TankType type){switch (type){case 1:return new Tank80();break;case 2:return new Tank99();break;default:return NULL;break;}} };int _tmain(int argc, _TCHAR* argv[]) {TankFactory *factory = new TankFactory();TankType type = T99;factory->createTank(type)->message();return 0; }

2)、工廠方法模式:是指定義一個創建對象的接口,讓子類決定實例化哪一個類,Factory Method使一個類的實例化延遲到其子類。
? ? ? ? 主要解決:主要解決接口選擇的問題。,多個工廠,多個產品,每個產品對應于一個工廠。
? ? ? ? 何時使用:我們明確地計劃不同條件下創建不同實例時。
? ? ? ? 如何解決:讓其子類實現工廠接口,返回的也是一個抽象的產品。
? ? ? ? 關鍵代碼:創建過程在其子類執行。
? ? ? ? 缺點:每增加一種產品,就需要增加一個對象工廠。相比簡單工廠模式,工廠方法模式需要定義更多的類。

#include "iostream" using namespace std;class Product { public:virtual void show() = 0; };class Product_A : public Product { public:void show(){cout << "Product_A" << endl;} };class Product_B : public Product { public:void show(){cout << "Product_B" << endl;} };class Factory { public:virtual Product* create() = 0; };class Factory_A : public Factory { public:Product* create(){return new Product_A;} };class Factory_B : public Factory { public:Product* create(){return new Product_B;} };int _tmain(int argc, _TCHAR* argv[]) {Factory_A* productA = new Factory_A();Factory_B* productB = new Factory_B();productA->create()->show();productB->create()->show();system("pause");return 0; }

3)、抽象工廠模式:提供一個創建一系列相關或相互依賴的對象接口,而無需指定它們的具體類。
??   ?主要解決:主要解決接口選擇的問題,多個工廠,多個產品,并且每個產品可以包含多個型號。此時工廠和產品都是通過? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?虛基類的方式構建。每一個工廠類可以生產同一個產品的多個型號。
??   ?何時使用:系統的產品有多于一個的產品族,而系統只消費其中某一族的產品。
??   ?如何解決:在一個產品族里面,定義多個產品。
?? ?  關鍵代碼:在一個工廠里聚合多個同類產品。
?? ?  缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。

#include "iostream" using namespace std;//定義抽象類 class product1 { public:virtual void show() = 0; };//定義具體類 class product_A1 :public product1 { public:void show(){ cout << "product A1" << endl; } };class product_B1 :public product1 { public:void show(){ cout << "product B1" << endl; } };//定義抽象類 class product2 { public:virtual void show() = 0; };//定義具體類 class product_A2 :public product2 { public:void show(){ cout << "product A2" << endl; } };class product_B2 :public product2 { public:void show(){ cout << "product B2" << endl; } };class Factory { public:virtual product1 *creat1() = 0;virtual product2 *creat2() = 0; };class FactoryA:public Factory { public:product1 *creat1(){ return new product_A1(); }product2 *creat2(){ return new product_A2(); } };class FactoryB:public Factory { public:product1 *creat1(){ return new product_B1(); }product2 *creat2(){ return new product_B2(); } };int _tmain(int argc, _TCHAR* argv[]) {FactoryA *factoryA = new FactoryA();factoryA->creat1()->show();factoryA->creat2()->show();FactoryB *factoryB = new FactoryB();factoryB->creat1()->show();factoryB->creat2()->show();return 0; }

*2、 策略模式:是指定義一系列的算法,把它們一個個封裝起來,并且使它們可以互相替換。使得算法可以獨立于使用它的客戶而變化,也就是說這些算法所完成的功能是一樣的,對外接口是一樣的,只是各自現實上存在差異。

? ? 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。
?? ?何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為,比如說A產品類的加法和減法與B產品的加法減法算? ? ? ? ? ? ? ? ? ? ? ? 法不一樣。
?? ?如何解決:將這些算法封裝成一個一個的類,任意地替換。
?? ?關鍵代碼:實現同一個接口。
?? ?缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。

#include "iostream" using namespace std;class Strategy { public:virtual void Algorithm() = 0; };class ConcreteStrategyA : public Strategy {void Algorithm(){cout << "算法A實現" << endl;} };class ConcreteStrategyB : public Strategy {void Algorithm(){cout << "算法B實現" << endl;} };class ConcreteStrategyC : public Strategy {void Algorithm(){cout << "算法C實現" << endl;} }; //上下文 class Context { private:Strategy *strategy; public:Context(Strategy *strategy){this->strategy = strategy;}void ContextAlgothrim(){this->strategy->Algorithm();} };int _tmain(int argc, _TCHAR* argv[]) {Context *context;//Acontext = new Context(new ConcreteStrategyA());context->ContextAlgothrim();//Bcontext = new Context(new ConcreteStrategyB());context->ContextAlgothrim();//Ccontext = new Context(new ConcreteStrategyC());context->ContextAlgothrim();return 0; }

3、適配器模式:將一個類的接口轉換成客戶希望的另一個接口,使得原本由于接口不兼容而不能一起工作的哪些類可以一起工作。

適配器模式有三種:1.類的適配器 2.對象適配器 3.缺省適配器

? ? 示例:比如你在網上買了一個手機,但是買家給你發回來了一個3接頭的充電器,但是恰好你又沒有3接頭的插槽,只有2個接口的插槽,于是你很直然地便會想到去找你個3接口轉兩接口的轉換器。簡單的分析下這個轉換器便是我們這里的適配器Adapter。三相插頭便是我們要適配的Adaptee

1.類的適配器

當客戶在接口中定義了他期望的行為時,我們就可以應用適配器模式,提供一個實現該接口的類,并且擴展已有的類,通過創建子類來實現適配。

#include "iostream" using namespace std;//這是你的三相插頭 class ThreePhaseOutlet { public:void doThreePhasePlugin(){cout << "三相插頭強勢插入!" << endl;} };//這是你想要的兩相插頭 class TwoPhaseOutlet { public:virtual void doPlugin() = 0; };//然后你將需要找到一個轉接頭,將三相插頭轉換為“兩相插頭 class OutletConvertor : public TwoPhaseOutlet, public ThreePhaseOutlet { public:void doPlugin(){doConvertor();doThreePhasePlugin();}void doConvertor(){cout << "三相插頭轉為兩廂插頭!" << endl;} };int _tmain(int argc, _TCHAR* argv[]) {TwoPhaseOutlet* outlet = new OutletConvertor();outlet->doPlugin();return 0; }

2.對象適配器

對象適配器”通過組合除了滿足“用戶期待接口”還降低了代碼間的不良耦合。在工作中推薦使用“對象適配”。

#include "iostream" using namespace std;//這是你的三相插頭 class ThreePhaseOutlet { public:void doThreePhasePlugin(){cout << "三相插頭強勢插入!" << endl;} };//這是你想要的兩相插頭 class TwoPhaseOutlet { public:virtual void doPlugin() = 0; };//對象適配器相比類適配器來說更加靈活,他可以選擇性適配自己想適配的對象。例如我們下面把代碼改成這樣,你也許就會明白為什么我這樣說: class OutletConvertor : public TwoPhaseOutlet { public:OutletConvertor(){m_out = new ThreePhaseOutlet;}void doPlugin(){doConvertor();m_out->doThreePhasePlugin();}void doConvertor(){cout << "三相插頭轉為兩廂插頭!" << endl;}public:ThreePhaseOutlet *m_out; };int _tmain(int argc, _TCHAR* argv[]) {TwoPhaseOutlet *outlet = new OutletConvertor();outlet->doPlugin();return 0; }

3.缺省適配器

缺省適配器模式是一種特殊的適配器模式,但這個適配器是由一個抽象類實現的,并且在抽象類中要實現目標接口中所規定的所有方法,但很多方法的實現都是“平庸”的實現,也就是說,這些方法都是空方法。而具體的子類都要繼承此抽象類。

#include "iostream" using namespace std;class Target { public:virtual void f1(){};virtual void f2(){};virtual void f3(){}; }; class DefaultAdapter : public Target { public:void f1() {}void f2() {}void f3() {} }; class MyInteresting :public DefaultAdapter { public:void f3(){cout << "呵呵,我就對f3()方法感興趣,別的不管了!" << endl;} };int _tmain(int argc, _TCHAR* argv[]) {// Create adapter and place a requestTarget *t = new MyInteresting();t->f3();return 0; }

*4. 單例模式(推薦:1為普通單例,3為多線程)

? ? 單例模式:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
?? ?主要解決:一個全局使用的類頻繁地創建與銷毀。
?? ?何時使用:想控制實例數目,節省系統資源的時候。
?? ?如何解決:判斷系統是否已存在單例,如果有則返回,沒有則創建。
?? ?關鍵代碼:構造函數是私有的。

 單例大約有兩種實現方法:懶漢與餓漢。
??? 懶漢:故名思義,不到萬不得已就不會去實例化類,也就是說在第一次用到類實例的時候才會去實例化,所以上邊的經典方法? ? ? ? ? ? ? ? 被歸為懶漢實現;
??? 餓漢:餓了肯定要饑不擇食。所以在單例類定義的時候就進行實例化。
 特點與選擇:
??? 由于要進行線程同步,所以在訪問量比較大,或者可能訪問的線程比較多時,采用餓漢實現,可以實現更好的性能。這是以空? ? ? 間換時間。
??? 在訪問量較小時,采用懶漢實現。這是以時間換空間。

1.懶漢式一般實現:非線程安全,GetInstance返回的實例指針需要delete

#include "iostream" using namespace std;class Singleton { public:static Singleton* GetInstance();~Singleton(){}int add(int a, int b){return a + b;} private:static Singleton* m_pSingleton;Singleton(){}Singleton(const Singleton& obj) = delete; //明確拒絕Singleton& operator=(const Singleton& obj) = delete; //明確拒絕 };Singleton* Singleton::m_pSingleton = NULL;Singleton* Singleton::GetInstance() {if (m_pSingleton == NULL){m_pSingleton = new Singleton;}return m_pSingleton; }int _tmain(int argc, _TCHAR* argv[]) {Singleton* p = Singleton::GetInstance();printf("%d\n", p->add(1, 2));return 0; }

構造帶參數

.h

#ifndef _LOG_H_ #define _LOG_H_/********************************************************************** * 版權所有 (C)2015, Zhao Yun。 * * 文件名稱:log.cpp * 文件標識:無 * 內容摘要:演示日志信息的打印方法 * 其它說明:無 * 當前版本:V1.0 * 作 者:Zhao Yun * 完成日期:20150522 * * **********************************************************************/ #include <iostream> #include <stdio.h> #include <time.h> #include <sys/time.h> #include <stdlib.h> #include <string.h> #include "global.h"// 日志級別定義 #define LOG_FATAL 0 // 嚴重錯誤 #define LOG_ERROR 1 // 一般錯誤 #define LOG_WARN 2 // 警告 #define LOG_INFO 3 // 一般信息 #define LOG_TRACE 4 // 跟蹤信息 #define LOG_DEBUG 5 // 調試信息 #define LOG_ALL 6 // 所有信息class LogOperation { public:static LogOperation* GetInstance(char* config_path);virtual ~LogOperation();//將內容寫到日志文件中void WriteLogFile(int iLogLevel, const char *pszContent, const char *pszFileName = __FILE__, const char *pszFunctionName = __FUNCTION__, const int iCodeLine = __LINE__);//設置日志路徑void SetLogFilePath();//從配置文件中獲取字符串void GetConfigFileStringValue(const char *pszSectionName, const char *pszKeyName, const char *pDefaultVal, char *pszOutput, int iOutputLen, const char *pszConfigFileName);//從配置文件中獲取整型變量int GetConfigFileIntValue(const char *pszSectionName, const char *pszKeyName, int iDefaultVal, const char *pszConfigFileName);private:LogOperation(char* log_path);//獲取時間串void GetTime(char *pszTimeStr);//獲取對應的日志等級const char *LogLevel(const int iLogLevel);//獲取具體的字符串值void GetStringContentValue(FILE *fp, const char *pszSectionName, const char *pszKeyName, char *pszOutput, int iOutputLen);private:static LogOperation* m_plogoperation;int g_iLogPosition; //在日志信息中顯示"文件名/函數名/代碼行數"信息 1為寫int g_iLogLevel; //日志等級char *g_sConfigureFilePath; //配置文件路徑char g_sLogFilePath[512]; //日志文件路徑 };#endif

?.cpp

/********************************************************************** * 功能描述: 單例模式 * 輸入參數: 無 * 輸出參數: 無 * 返 回 值: 無 * 其它說明: 無 * 修改日期 版本號 修改人 修改內容 * ------------------------------------------------------------------- * 20150522 V1.0 Zhao Yun 創建 ********************************************************************/ LogOperation *LogOperation::m_plogoperation = NULL;LogOperation *LogOperation::GetInstance(char* config_path) {if (m_plogoperation == NULL){m_plogoperation = new LogOperation(config_path);}return m_plogoperation; }/********************************************************************** * 功能描述: 構造函數 * 輸入參數: 無 * 輸出參數: 無 * 返 回 值: 無 * 其它說明: 無 * 修改日期 版本號 修改人 修改內容 * ------------------------------------------------------------------- * 20150522 V1.0 Zhao Yun 創建 ********************************************************************/ LogOperation::LogOperation(char* log_path) {//獲取路徑g_sConfigureFilePath = log_path;printf ("g_sConfigureFilePath = %s\n", g_sConfigureFilePath);//在日志信息中顯示"文件名/函數名/代碼行數"信息 1為寫g_iLogPosition = 1;// 日志等級g_iLogLevel = GetConfigFileIntValue("LOG", "LogLevel", 5, g_sConfigureFilePath);printf ("g_iLogLevel = %d\n", g_iLogLevel);//設置日志路徑GetConfigFileStringValue("LOG", "LogFilePath", NULL, g_sLogFilePath, 512-1, g_sConfigureFilePath);printf ("g_sLogFilePath = %s\n", g_sLogFilePath); }/********************************************************************** * 功能描述: 析構函數 * 輸入參數: 無 * 輸出參數: 無 * 返 回 值: 無 * 其它說明: 無 * 修改日期 版本號 修改人 修改內容 * ------------------------------------------------------------------- * 20150522 V1.0 Zhao Yun 創建 ********************************************************************/ LogOperation::~LogOperation() {delete m_plogoperation; }

main.cpp

LogOperation *log = LogOperation::GetInstance(spLogFilePath);// 先打印版本相關信息snprintf(szLogContent, sizeof(szLogContent)-1, "Version [1.0], Build time[%s %s].", __DATE__, __TIME__);log->WriteLogFile(LOG_INFO, szLogContent);

?

2.懶漢式加鎖lock,線程安全

std::mutex mt;class Singleton { public:static Singleton* getInstance(); private:Singleton(){}Singleton(const Singleton&) = delete; //明確拒絕Singleton& operator=(const Singleton&) = delete; //明確拒絕static Singleton* m_pSingleton;}; Singleton* Singleton::m_pSingleton = NULL;Singleton* Singleton::getInstance() {if(m_pSingleton == NULL){mt.lock();m_pSingleton = new Singleton();mt.unlock();}return m_pSingleton; }

3. 惡漢模式:線程安全,注意delete

class Singleton { public:static Singleton* GetInstance();int add(int a, int b){return a + b;} private:Singleton(){}Singleton(const Singleton&) = delete; //明確拒絕Singleton& operator=(const Singleton&) = delete; //明確拒絕static Singleton* m_pSingleton; };Singleton* Singleton::m_pSingleton = new Singleton();Singleton* Singleton::GetInstance() {return m_pSingleton; }int _tmain(int argc, _TCHAR* argv[]) {Singleton* p = Singleton::GetInstance();printf("%d\n", p->add(1, 2));return 0; }

5、原型模式:用原型實例指定創建對象的種類,并且通過拷貝這些原型創建新的對象。

? ? 主要解決:在運行期建立和刪除對象。
?? ?何時使用:1).當我們的對象類型不是開始就能確定的,而這個類型是在運行期確定的話,那么我們通過這個類型的對象克隆出一個新的對象比較容易一些;2).有的時候,我們需要一個對象在某個狀態下的副本,此時,我們使用原型模式是最好的選擇;例如:一個對象,經過一段處理之后,其內部的狀態發生了變化;這個時候,我們需要一個這個狀態的副本,如果直接new一個新的對象的話,但是它的狀態是不對的,此時,可以使用原型模式,將原來的對象拷貝一個出來,這個對象就和之前的對象是完全一致的了;3).當我們處理一些比較簡單的對象時,并且對象之間的區別很小,可能就幾個屬性不同而已,那么就可以使用原型模式來完成,省去了創建對象時的麻煩了;4).有的時候,創建對象時,構造函數的參數很多,而自己又不完全的知道每個參數的意義,就可以使用原型模式來創建一個新的對象,不必去理會創建的過程。

?? ?->適當的時候考慮一下原型模式,能減少對應的工作量,減少程序的復雜度,提高效率
?? ?如何解決:利用已有的一個原型對象,快速地生成和原型對象一樣的實例。
?? ?關鍵代碼:拷貝,return new className(*this);

class Clone { public:Clone(){}virtual ~Clone(){}virtual Clone* clone() = 0;virtual void show() = 0; };class Sheep:public Clone { public:Sheep(int id, string name):Clone(),m_id(id),m_name(name){cout << "Sheep() id add:" << &m_id << endl;cout << "Sheep() name add:" << &m_name << endl;}~Sheep(){}Sheep(const Sheep& obj){this->m_id = obj.m_id;this->m_name = obj.m_name;cout << "Sheep(const Sheep& obj) id add:" << &m_id << endl;cout << "Sheep(const Sheep& obj) name add:" << &m_name << endl;}Clone* clone(){return new Sheep(*this);}void show(){cout << "id :" << m_id << endl;cout << "name:" << m_name.data() << endl;} private:int m_id;string m_name; };int main() {Clone* s1 = new Sheep(1, "abs");s1->show();Clone* s2 = s1->clone();s2->show();delete s1;delete s2;return 0; }

*6、模板模式:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

? ? 主要解決:多個子類有相同的方法,并且邏輯相同,細節有差異。
?? ?如何解決:對重要,復雜的算法,將核心算法設計為模板方法,周邊細節由子類實現,重構時,經常使用的方法,將相同的代碼抽象到父類,通過鉤子函數約束行為。
?? ?關鍵代碼:在抽象類實現通用接口,細節變化在子類實現。
?? ?缺點:每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。

#include "iostream" using namespace std;class Computer { public:void product(){installCpu();installRam();installGraphicsCard();}protected:virtual void installCpu() = 0;virtual void installRam() = 0;virtual void installGraphicsCard() = 0;};class ComputerA :public Computer { protected:void installCpu() override{cout << "ComputerA install Inter Core i5" << endl;}void installRam() override{cout << "ComputerA install 2G Ram" << endl;}void installGraphicsCard() override{cout << "ComputerA install Gtx940 GraphicsCard" << endl;} };class ComputerB :public Computer { protected:void installCpu() override{cout << "ComputerB install Inter Core i7" << endl;}void installRam() override{cout << "ComputerB install 4G Ram" << endl;}void installGraphicsCard() override{cout << "ComputerB install Gtx960 GraphicsCard" << endl;} };int _tmain(int argc, _TCHAR* argv[]) {ComputerA a;a.product();ComputerB b;b.product();return 0; }

7、 建造者模式:將復雜對象的構建和其表示分離,使得同樣的構建過程可以創建不同的表示。

? ? 主要解決:一個復雜對象的創建工作,由各個部分的子對象用一定的算法構成;由于需求變化,這個復雜對象的各個部分經常? ? ? ? ? ? ? ? ? ? ? 面臨變化,但將它們組合在一起的算法卻相對穩定。
?? ?如何解決:將變與不變分開
?? ?關鍵代碼:建造者:創建和提供實例,Director:管理建造出來的實例的依賴關系。。
?? ?缺點:1、產品必須有共同點,范圍有限制。 2、如內部變化復雜,會有很多的建造類。

typedef enum {type1,type2 }ProductType;class Product //產品 { public:void setNum(int num);void setColor(string color);void setType(ProductType type);void showProduct(); private:int m_num;string m_color;ProductType m_type;};void Product::setNum(int num) {m_num = num; }void Product::setColor(string color) {m_color = color; }void Product::setType(ProductType type) {m_type = type; }void Product::showProduct() {cout << "Product: " << endl;cout << "num : " << m_num << endl;cout << "color: " << m_color.data() << endl;cout << "type : " << m_type << endl; }//建造者父類,定義接口 class Builder { public:Builder(){}virtual ~Builder(){}virtual void buildNum(int num) = 0;virtual void buildColor(string color) = 0;virtual void buildType(ProductType type) = 0;virtual void createProduct() = 0;virtual Product* getProduct() = 0;virtual void show() = 0; };//建造者A class BuilderA :public Builder { public:BuilderA(){}~BuilderA(){}void buildNum(int num) override;void buildColor(string color) override;void buildType(ProductType type) override;void createProduct() override;Product* getProduct() override;void show() override; private:Product* m_product; };void BuilderA::buildNum(int num) {cout << "BuilderA build Num: " << num << endl;m_product->setNum(num); }void BuilderA::buildColor(string color) {cout << "BuilderA build color: " << color.data() << endl;m_product->setColor(color); }void BuilderA::buildType(ProductType type) {cout << "BuilderA build type: " << type << endl;m_product->setType(type); }void BuilderA::createProduct() {cout << "BuilderA CreateProduct: " << endl;m_product = new Product(); }Product* BuilderA::getProduct() {return m_product; } void BuilderA::show() {m_product->showProduct(); }//建造者B class BuilderB :public Builder { public:BuilderB(){}~BuilderB(){}void buildNum(int num) override;void buildColor(string color) override;void buildType(ProductType type) override;void createProduct() override;Product* getProduct() override;void show() override; private:Product* m_product; };void BuilderB::buildNum(int num) {cout << "BuilderB build Num: " << num << endl;m_product->setNum(num); }void BuilderB::buildColor(string color) {cout << "BuilderB build color: " << color.data() << endl;m_product->setColor(color); }void BuilderB::buildType(ProductType type) {cout << "BuilderB build type: " << type << endl;m_product->setType(type); }void BuilderB::createProduct() {cout << "BuilderB CreateProduct: " << endl;m_product = new Product(); }Product* BuilderB::getProduct() {return m_product; } void BuilderB::show() {m_product->showProduct(); }//管理類,負責安排構造的具體過程 class Director { public:Director(Builder* builder) :m_builder(builder){}void construct(int num, string color, ProductType type){m_builder->createProduct();m_builder->buildNum(num);m_builder->buildColor(color);m_builder->buildType(type);}private:Builder* m_builder; };

8、外觀模式:為子系統中的一組接口定義一個一致的界面,外觀模式提供了一個高層接口,這個接口使得這一子系統更加容易被使用;對于復雜的系統,系統為客戶提供一個簡單的接口,把復雜的實現過程封裝起來,客戶不需要了解系統內部的細節。

? ? 主要解決:客戶不需要了解系統內部復雜的細節,只需要一個接口;系統入口。
?? ?如何解決:客戶不直接與系統耦合,而是通過外觀類與系統耦合。
?? ?關鍵代碼:客戶與系統之間加一個外觀層,外觀層處理系統的調用關系、依賴關系等。
?? ?缺點:需要修改時不易繼承、不易修改。

class Cpu { public:void productCpu(){cout << "Product Cpu" << endl;} };class Ram { public:void productRam(){cout << "Product Ram" << endl;} };class Graphics { public:void productGraphics(){cout << "Product Graphics" << endl;} };class Computer { public:void productComputer(){Cpu cpu;cpu.productCpu();Ram ram;ram.productRam();Graphics graphics;graphics.productGraphics();} };int _tmain(int argc, _TCHAR* argv[]) {//客戶直接調用computer生產函數,無需關心具體部件的生產過程。也可直接單獨生產部件Computer computer;computer.productComputer();Cpu cpu;cpu.productCpu();return 0; }

9、組合模式:將對象組合成樹形結構以表示“部分-整體”的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。

? ? 主要解決:它在我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以像處理簡單元素一樣處理復雜元? ? ? ? ? ? ? ? ? ? ? ? ?素,從而使得客戶程序與復雜元素的內部結構解耦。
?? ?如何解決:樹枝和樹葉實現統一接口,樹枝內部組合該接口。
?? ?關鍵代碼:樹枝內部組合該接口,并且含有內部屬性list,里面放Component。

#include "iostream" #include "list" #include <future> using namespace std;class Company { public:Company(string name) :m_name(name){}virtual ~Company(){}virtual void add(Company* company) = 0;virtual void remove(string name) = 0;virtual void display(int depth) = 0;string getName(){return m_name;}protected:string m_name; };//具體的公司 class ConcreteCompany :public Company //樹枝 { public:ConcreteCompany(string name) :Company(name){}~ConcreteCompany(){cout << "~ConcreteCompany()" << endl;}void add(Company* company) override;void remove(string name) override;void display(int depth) override;private:list<shared_ptr<Company>> m_listCompany;};void ConcreteCompany::add(Company* company) {shared_ptr<Company> temp(company);m_listCompany.push_back(temp); }void ConcreteCompany::remove(string name) {list<shared_ptr<Company>>::iterator iter = m_listCompany.begin();for (; iter != m_listCompany.end(); iter++){shared_ptr<Company> temp(*iter);string strName = temp.get()->getName();if (name == strName){m_listCompany.erase(iter);}} }void ConcreteCompany::display(int depth) {for (int i = 0; i < depth; i++){cout << "-";}cout << m_name.data() << endl;list<shared_ptr<Company>>::iterator iter = m_listCompany.begin();for (; iter != m_listCompany.end(); iter++){shared_ptr<Company> temp(*iter);temp.get()->display(depth + 2);} }//公司下的部門 class FinanceDept :public Company //樹葉 { public:FinanceDept(string name) :Company(name){}~FinanceDept(){cout << "~FinanceDept()" << endl;}void add(Company* company) override;void remove(string name) override;void display(int depth) override; };void FinanceDept::add(Company* company) {cout << "FinanceDept add failed" << endl; }void FinanceDept::remove(string name) {cout << "FinanceDept remove failed" << endl; }void FinanceDept::display(int depth) {for (int i = 0; i < depth; i++){cout << "-";}cout << m_name.data() << endl; }//公司下的部門 class HRDept :public Company //樹葉 { public:HRDept(string name) :Company(name){}~HRDept(){cout << "~HRDept()" << endl;}void add(Company* company) override;void remove(string name) override;void display(int depth) override; };void HRDept::add(Company* company) {cout << "HRDept add failed" << endl; }void HRDept::remove(string name) {cout << "HRDept remove failed" << endl; }void HRDept::display(int depth) {for (int i = 0; i < depth; i++){cout << "-";}cout << m_name.data() << endl; }int _tmain(int argc, _TCHAR* argv[]) {Company* root = new ConcreteCompany("zong");Company* f1 = new FinanceDept("F1");Company* h1 = new HRDept("H1");root->add(f1);root->add(h1);Company* c1 = new ConcreteCompany("fen1");Company* f2 = new FinanceDept("F2");Company* h2 = new HRDept("H2");c1->add(f2);c1->add(h2);root->add(c1);root->display(0);delete root;return 0; }

*10、 代理模式:為其它對象提供一種代理以控制對這個對象的訪問。

? ? 主要解決:在直接訪問對象時帶來的問題,比如:要訪問的對象在遠程服務器上。在面向對象系統中,有些對象由于某些原? ? ? ? ? ? ? ? ? ? ? ? ? 因,直接訪問會給使用者或系統帶來很多麻煩,可以在訪問此對象時加上一個對此對象的訪問層。
?? ?如何解決:增加中間代理層。
?? ?關鍵代碼:實現與被代理類組合。

class Gril { public:Gril(string name = "gril") :m_string(name){}string getName(){return m_string;} private:string m_string; };class Profession { public:virtual ~Profession(){}virtual void profess() = 0; };class YoungMan :public Profession { public:YoungMan(Gril gril) :m_gril(gril){}void profess(){cout << "Young man love " << m_gril.getName().data() << endl;} private:Gril m_gril; };class ManProxy :public Profession { public:ManProxy(Gril gril) :m_man(new YoungMan(gril)){}void profess(){cout << "I am Proxy" << endl;m_man->profess();} private:YoungMan* m_man; };int _tmain(int argc, _TCHAR* argv[]) {Gril gril("hei");Profession* proxy = new ManProxy(gril);proxy->profess();delete proxy;return 0; }

11、享元模式:運用共享技術有效地支持大量細粒度的對象。

? ? 主要解決:在有大量對象時,把其中共同的部分抽象出來,如果有相同的業務請求,直接返回內存中已有的對象,避免重新創? ? ? ? ? ? ? ? ? ? ? ? 建。
?? ?如何解決:用唯一標識碼判斷,如果內存中有,則返回這個唯一標識碼所標識的對象。
?? ?關鍵代碼:將內部狀態作為標識,進行共享。

//以Money的類別作為內部標識,面值作為外部狀態。 enum MoneyCategory //類別,內在標識,作為標識碼 {Coin,bankNote };enum FaceValue //面值,外部標識,需要存儲的對象 {ValueOne = 1,ValueTwo };class Money //抽象父類 { public:Money(MoneyCategory cate):m_mCate(cate){}virtual ~Money(){ cout << "~Money() " << endl; }virtual void save() = 0; private:MoneyCategory m_mCate; };class MoneyCoin:public Money //具體子類1 { public:MoneyCoin(MoneyCategory cate):Money(cate){}~MoneyCoin(){ cout << "~MoneyCoin()" << endl; }void save(){cout << "Save Coin" << endl;} };class MoneyNote:public Money //具體子類2 { public:MoneyNote(MoneyCategory cate):Money(cate){}~MoneyNote(){ cout << "~MoneyNote()" << endl; }void save(){cout << "Save BankNote" << endl;} };class Bank { public:Bank():m_coin(nullptr),m_note(nullptr),m_count(0){}~Bank(){if(m_coin != nullptr){delete m_coin;m_coin = nullptr;}if(m_note != nullptr){delete m_note;m_note = nullptr;}}void saveMoney(MoneyCategory cate, FaceValue value){switch(cate) //以類別作為標識碼{case Coin:{if(m_coin == nullptr) //內存中存在標識碼所標識的對象,則直接調用,不再創建{m_coin = new MoneyCoin(Coin);}m_coin->save();m_vector.push_back(value);break;}case bankNote:{if(m_note == nullptr){m_note = new MoneyNote(bankNote);}m_note->save();m_vector.push_back(value);break;}default:break;}}int sumSave(){auto iter = m_vector.begin();for(; iter != m_vector.end(); iter++){m_count += *iter;}return m_count;}private:vector<FaceValue> m_vector;Money* m_coin;Money* m_note;int m_count; };int main() {Bank b1;b1.saveMoney(Coin, ValueOne);b1.saveMoney(Coin, ValueTwo);b1.saveMoney(Coin, ValueTwo);b1.saveMoney(bankNote, ValueOne);b1.saveMoney(bankNote, ValueTwo);cout << b1.sumSave() << endl;return 0; }

12、 橋接模式:將抽象部分與實現部分分離,使它們都可以獨立變換。

? ? 主要解決:在有很多中可能會變化的情況下,用繼承會造成類爆炸問題,不易擴展。
?? ?如何解決:把不同的分類分離出來,使它們獨立變化,減少它們之間的耦合。
?? ?關鍵代碼:將現實獨立出來,抽象類依賴現實類。

//將各種App、各種手機全部獨立分開,使其自由組合橋接 class App { public:virtual ~App(){ cout << "~App()" << endl; }virtual void run() = 0; };class GameApp :public App { public:void run(){cout << "GameApp Running" << endl;} };class TranslateApp :public App { public:void run(){cout << "TranslateApp Running" << endl;} };class MobilePhone { public:virtual ~MobilePhone(){ cout << "~MobilePhone()" << endl; }virtual void appRun(App* app) = 0; //實現App與手機的橋接 };class XiaoMi :public MobilePhone { public:void appRun(App* app){cout << "XiaoMi: ";app->run();} };class HuaWei :public MobilePhone { public:void appRun(App* app){cout << "HuaWei: ";app->run();} };int _tmain(int argc, _TCHAR* argv[]) {App* gameApp = new GameApp;App* translateApp = new TranslateApp;MobilePhone* mi = new XiaoMi;MobilePhone* hua = new HuaWei;mi->appRun(gameApp);mi->appRun(translateApp);hua->appRun(gameApp);hua->appRun(translateApp);delete hua;delete mi;delete gameApp;delete translateApp;return 0; }

13、 裝飾模式:動態地給一個對象添加一些額外的功能,就新增加功能來說,裝飾器模式比生產子類更加靈活。

? ? 主要解決:通常我們為了擴展一個類經常使用繼承的方式,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會很? ? ? ? ? ? ? ? ? ? ? ? 膨脹。
?? ?如何解決:將具體的功能劃分,同時繼承裝飾者類。
?? ?關鍵代碼:裝飾類復合和繼承組件類,具體的擴展類重寫父類的方法。

class Dumplings //抽象類 餃子 { public:virtual ~Dumplings(){}virtual void showDressing() = 0; };class MeatDumplings :public Dumplings //現實類 肉餡餃子 { public:~MeatDumplings(){ cout << "~MeatDumplings()" << endl; }void showDressing(){cout << "Add Meat" << endl;} };class DecoratorDumpling :public Dumplings //裝飾類 { public:DecoratorDumpling(Dumplings* d) :m_dumpling(d){}virtual ~DecoratorDumpling(){ cout << "~DecoratorDumpling()" << endl; }void showDressing(){m_dumpling->showDressing();} private:Dumplings* m_dumpling; };class SaltDecorator :public DecoratorDumpling // 裝飾類 加鹽 { public:SaltDecorator(Dumplings* d) :DecoratorDumpling(d){}~SaltDecorator(){ cout << "~SaltDecorator()" << endl; }void showDressing(){DecoratorDumpling::showDressing(); //注意點addDressing();}private:void addDressing(){cout << "Add Salt" << endl;} };class OilDecorator :public DecoratorDumpling //裝飾類 加油 { public:OilDecorator(Dumplings* d) :DecoratorDumpling(d){}~OilDecorator(){ cout << "~OilDecorator()" << endl; }void showDressing(){DecoratorDumpling::showDressing(); //注意點addDressing();}private:void addDressing(){cout << "Add Oil" << endl;} };class CabbageDecorator :public DecoratorDumpling //裝飾類 加蔬菜 { public:CabbageDecorator(Dumplings* d) :DecoratorDumpling(d){}~CabbageDecorator(){ cout << "~CabbageDecorator()" << endl; }void showDressing(){DecoratorDumpling::showDressing(); //注意點addDressing();}private:void addDressing(){cout << "Add Cabbage" << endl;} };int _tmain(int argc, _TCHAR* argv[]) {Dumplings* d = new MeatDumplings; //原始的肉餃子Dumplings* d1 = new SaltDecorator(d); //加鹽后的餃子Dumplings* d2 = new OilDecorator(d1); //加油后的餃子Dumplings* d3 = new CabbageDecorator(d2); //加蔬菜后的餃子d3->showDressing();delete d;delete d1;delete d2;delete d3;return 0; }

*14、備忘錄模式:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可以將該對象恢復到原來保存的狀態。

? ? 如何解決:通過一個備忘錄類專門存儲對象狀態。
?? ?關鍵代碼:備忘錄類、客戶類、備忘錄管理類;客戶類不與備忘錄類耦合,而是與備忘錄管理類耦合。

typedef struct //需要保存的信息 {int grade;string arm;string corps; }GameValue;class Memento //備忘錄類 { public:Memento(){}Memento(GameValue value) :m_gameValue(value){}GameValue getValue(){return m_gameValue;} private:GameValue m_gameValue; };class Game //客戶類 游戲 { public:Game(GameValue value) :m_gameValue(value){}void addGrade() //等級增加{m_gameValue.grade++;}void replaceArm(string arm) //更換武器{m_gameValue.arm = arm;}void replaceCorps(string corps) //更換工會{m_gameValue.corps = corps;}Memento saveValue() //保存當前信息{Memento memento(m_gameValue);return memento;}void load(Memento memento) //載入信息{m_gameValue = memento.getValue();}void showValue(){cout << "Grade: " << m_gameValue.grade << endl;cout << "Arm : " << m_gameValue.arm.data() << endl;cout << "Corps: " << m_gameValue.corps.data() << endl;} private:GameValue m_gameValue; };class Caretake //備忘錄管理類 { public:void save(Memento memento) //保存信息{m_memento = memento;}Memento load() //讀已保存的信息{return m_memento;} private:Memento m_memento; };int _tmain(int argc, _TCHAR* argv[]) {GameValue v1 = { 0, "Ak", "3K" };Game game(v1); //初始值game.addGrade();game.showValue();cout << "----------" << endl;Caretake care;care.save(game.saveValue()); //保存當前值game.addGrade(); //修改當前值game.replaceArm("M16");game.replaceCorps("123");game.showValue();cout << "----------" << endl;game.load(care.load()); //恢復初始值game.showValue();return 0; }

15、中介者模式:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之前的交互。

? ? 主要解決:對象與對象之前存在大量的關聯關系,這樣勢必會造成系統變得復雜,若一個對象改變,我們常常需要跟蹤與之關? ? ? ? ? ? ? ? ? ? ? ? 聯的對象,并做出相應的處理。
?? ?如何解決:將網狀結構分離為星型結構。
?? ?關鍵代碼:將相關對象的通信封裝到一個類中單獨處理。

class Mediator;class Person //抽象同事類 { public:virtual ~Person(){}virtual void setMediator(Mediator* mediator){m_mediator = mediator;}virtual void sendMessage(const string& message) = 0;virtual void getMessage(const string& message) = 0; protected:Mediator* m_mediator; };class Mediator //抽象中介類 { public:virtual ~Mediator(){}virtual void setBuyer(Person* buyer) = 0;virtual void setSeller(Person* seller) = 0;virtual void send(const string& message, Person* person) = 0; };class Buyer :public Person //買家類 { public:void sendMessage(const string& message){m_mediator->send(message, this);}void getMessage(const string& message){cout << "Buyer Get: " << message.data() << endl;} };class Seller :public Person //賣家類 { public:void sendMessage(const string& message){m_mediator->send(message, this);}void getMessage(const string& message){cout << "Seller Get: " << message.data() << endl;} };class HouseMediator :public Mediator //具體的中介類 { public:HouseMediator() :m_buyer(nullptr), m_seller(nullptr){}void setBuyer(Person* buyer){m_buyer = buyer;}void setSeller(Person *seller){m_seller = seller;}void send(const string& message, Person* person){if (person == m_buyer){m_seller->getMessage(message);}if (person == m_seller){m_buyer->getMessage(message);}} private:Person* m_buyer;Person* m_seller; };int _tmain(int argc, _TCHAR* argv[]) {Person* buyer = new Buyer;Person* seller = new Seller;Mediator* houseMediator = new HouseMediator;buyer->setMediator(houseMediator);seller->setMediator(houseMediator);houseMediator->setBuyer(buyer);houseMediator->setSeller(seller);buyer->sendMessage("1.5?");seller->sendMessage("2!!!");return 0; }

*16、職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之前的耦合關系,將這些對象連成一條鏈,并沿著這條鏈傳遞請求,直到有一個對象處理它為止。

? ? ?主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無需關心請求的處理細節和請求的傳? ? ? ? ? ? ? ? ? ? ? ? ? ?遞,所有職責鏈將請求的發送者和請求的處理者解耦了。
?? ?如何解決:職責鏈鏈扣類都現實統一的接口。
?? ?關鍵代碼:Handler內指明其上級,handleRequest()里判斷是否合適,不合適則傳遞給上級。

enum RequestLevel {One = 1,Two,Three };class Leader { public:Leader(Leader* leader):m_leader(leader){}virtual ~Leader(){}virtual void handleRequest(RequestLevel level) = 0; protected:Leader* m_leader; };class Monitor:public Leader //鏈扣1 { public:Monitor(Leader* leader):Leader(leader){}void handleRequest(RequestLevel level){if(level < Two){cout << "Mointor handle request : " << level << endl;}else{m_leader->handleRequest(level);}} };class Captain:public Leader //鏈扣2 { public:Captain(Leader* leader):Leader(leader){}void handleRequest(RequestLevel level){if(level < Three){cout << "Captain handle request : " << level << endl;}else{m_leader->handleRequest(level);}} };class General:public Leader //鏈扣3 { public:General(Leader* leader):Leader(leader){}void handleRequest(RequestLevel level){cout << "General handle request : " << level << endl;} };int main() {Leader* general = new General(nullptr);Leader* captain = new Captain(general);Leader* monitor = new Monitor(captain);monitor->handleRequest(Two);return 0; }

*17、觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都要得到通知并自動更新。

? ? 主要解決:一個對象更新,其它對象也要更新。
?? ?如何解決:目標類通知函數通知所有觀察者自動更新。
?? ?關鍵代碼:在目標類中增加一個ArrayList來存放觀察者們。

#include "iostream" #include "list" //#include <future> using namespace std;//數據模型為目標類,視圖為觀察者類。當數據模型發生改變時,通知視圖類更新 class View;class DataModel //目標抽象類 數據模型 { public:virtual ~DataModel(){}virtual void add(View* view) = 0;virtual void remove(View* view) = 0;virtual void notify() = 0; //通知函數 };class View //觀察者抽象類 視圖 { public:virtual ~View(){ cout << "~View()" << endl; }virtual void update() = 0; };class IntModel :public DataModel //具體的目標類, 整數模型 { public:~IntModel(){clear();}void add(View* view){auto iter = std::find(m_list.begin(), m_list.end(), view); //判斷是否重復添加if (iter == m_list.end()){m_list.push_back(view);}}void remove(View* view){auto iter = m_list.begin();for (; iter != m_list.end(); iter++){if (*iter == view){delete *iter; //釋放內存m_list.erase(iter); //刪除元素break;}}}void notify() //通知觀察者更新{auto iter = m_list.begin();for (; iter != m_list.end(); iter++){(*iter)->update();}} private:void clear(){if (!m_list.empty()){auto iter = m_list.begin();for (; iter != m_list.end(); iter++) //釋放內存{delete *iter;}}} private:list<View*> m_list; };class TreeView :public View //具體的觀察者類 視圖 { public:TreeView(string name) :m_name(name), View(){}~TreeView(){ cout << "~TreeView()" << endl; }void update(){cout << m_name.data() << " : Update" << endl;} private:string m_name; };int _tmain(int argc, _TCHAR* argv[]) {View* v1 = new TreeView("view1");View* v2 = new TreeView("view2");View* v3 = new TreeView("view3");View* v4 = new TreeView("view4");DataModel* model = new IntModel;model->add(v1);model->add(v2);model->add(v3);model->add(v2);model->add(v4);model->notify();cout << "----------" << endl;model->remove(v2);model->notify();delete model;return 0; }

?

總結

以上是生活随笔為你收集整理的C++ 常用设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美日韩性 | 日韩在线二区 | 91欧美视频网站 | 成人在线视频免费观看 | 9在线观看免费高清完整版在线观看明 | 不卡中文字幕在线 | 国产精品手机在线观看 | 国产69久久精品成人看 | 国产精品99爱 | 精品亚洲成a人在线观看 | 国产精品 中文在线 | 亚洲精品国产精品国产 | 国产精品久久三 | 五月天婷婷狠狠 | 99国产在线观看 | 国产一区二区观看 | 精品久久久久一区二区国产 | 国产视频精选 | 国产精彩视频一区 | 午夜精品剧场 | 久热av| 天天综合日日夜夜 | 久久免费看毛片 | 99精品视频在线播放免费 | 狠狠躁日日躁狂躁夜夜躁 | 亚洲九九影院 | 三级av在线 | 综合激情伊人 | 在线视频免费观看 | 99精品久久久久 | 国产原创av片 | 亚洲欧美成人综合 | 国产精品久久艹 | 久久久精品小视频 | 午夜三级在线 | 在线综合 亚洲 欧美在线视频 | 日av免费| 久久久精品国产免费观看同学 | 欧美aa一级片| 久久久久99999| 中文字幕 欧美性 | 欧美日韩国产在线观看 | 亚洲国产成人精品在线 | 日p视频 | 亚洲精品1234区 | 中文字幕在| 亚洲天堂视频在线 | 精品国产乱码久久久久 | 在线观看国产永久免费视频 | 午夜久久久久久久久久影院 | 久久久久国产精品免费网站 | 亚洲激情在线观看 | av大全在线免费观看 | 国产91精品高清一区二区三区 | 2018好看的中文在线观看 | 久久人人爽人人爽人人片av软件 | 日韩av手机在线观看 | 国产黄色片一级三级 | 久久99精品一区二区三区三区 | 国产在线观看国语版免费 | 亚洲视频一区二区三区在线观看 | 精品人人爽| 国产亚洲在 | 中文字幕一区二区三区在线播放 | 久久丁香 | 99爱这里只有精品 | 免费欧美 | 国产精品99久久久精品免费观看 | 亚洲免费av观看 | 久久国产精品二国产精品中国洋人 | 日韩在线 一区二区 | 亚洲91网站 | 亚洲视频一区二区三区在线观看 | 在线免费观看羞羞视频 | 91精品欧美 | 亚洲日韩精品欧美一区二区 | 国产精品国产三级国产aⅴ9色 | 玖玖爱免费视频 | av888av.com| 久久欧洲视频 | 色婷婷av一区二 | 国产欧美综合在线观看 | 欧美日韩一区二区三区免费视频 | 一区二区三区精品在线视频 | 亚洲精品在线网站 | 亚洲国产精品第一区二区 | 热久久影视| 久草在线资源免费 | 可以免费观看的av片 | 成人a免费看 | 日韩av有码在线 | 国产成人久久精品77777综合 | 免费日韩 精品中文字幕视频在线 | 麻花豆传媒mv在线观看网站 | 久久99精品久久只有精品 | 天天做综合网 | 久久九九网站 | 在线播放一区二区三区 | 99视频在线免费观看 | 日本视频久久久 | 久久久久久亚洲精品 | 久精品视频免费观看2 | 久久99久久精品国产 | 久草在线资源网 | 麻豆网站免费观看 | 欧美国产大片 | 欧美精品久久久久久久久久白贞 | 亚洲在线视频播放 | 国产a国产 | 97超碰国产在线 | 亚洲激情影院 | 欧美成人在线免费 | 日韩精品不卡 | 97精品在线 | 免费a一级| 三级av黄色 | 色婷婷 亚洲| 日韩电影在线观看一区二区 | 久久精品电影网 | 婷婷丁香社区 | 天天色宗合 | 中文字幕一区二区三区在线观看 | 99久久99久久精品 | 精品理论片 | 夜色成人av | 日韩精品久久中文字幕 | 国产日产精品久久久久快鸭 | 亚洲另类视频在线观看 | 国产精品福利无圣光在线一区 | 国产精品一区二区三区久久 | 日韩av资源在线观看 | 国产喷水在线 | 免费看黄20分钟 | 欧美日韩p片 | 欧美精品在线观看免费 | 在线观看日韩一区 | 国产精品毛片一区二区 | 久久久久久久久久久网 | 欧美另类z0zx | 久久成人精品电影 | 欧美精品一区二区在线观看 | 99久久婷婷国产精品综合 | 久久99国产精品视频 | 99国产一区 | 成人黄色小说视频 | 国产最顶级的黄色片在线免费观看 | 免费av小说 | 久久精品2 | 天堂av在线免费 | 久久久国产精品电影 | 奇人奇案qvod | 亚洲免费一级电影 | 婷婷国产一区二区三区 | 狠狠干网| 国产在线v| 久久99国产精品二区护士 | 欧美日韩中文在线视频 | 一本一本久久a久久 | 在线看v片成人 | 最新国产在线观看 | 国产一线在线 | 一区二区三区日韩在线观看 | 日韩一级理论片 | 久久成人精品 | 看片一区二区三区 | 在线免费色视频 | 狠狠操导航 | 国产精品一区二区在线免费观看 | 亚洲一区二区三区精品在线观看 | 日本久久成人 | 国内外成人免费在线视频 | 亚洲视频www | 欧美一级性生活片 | 五月婷亚洲| 手机在线视频福利 | 国产免费美女 | 激情电影影院 | 婷婷色婷婷 | 国产精品久久在线 | 波多野结衣一区二区 | www成人精品 | 麻豆免费观看视频 | 中字幕视频在线永久在线观看免费 | 亚洲精品国产高清 | 九九一级片 | 欧美孕妇视频 | 色综合久久88色综合天天 | 日韩91av | 国产99免费 | 欧美日韩亚洲在线观看 | 日韩欧美在线视频一区二区 | av中文字幕不卡 | 久久经典国产视频 | 成人av日韩 | 九九视频精品免费 | a天堂最新版中文在线地址 久久99久久精品国产 | 久久99亚洲热视 | 精品久久久久久国产91 | 久久精品国产一区二区三 | 黄色三级网站在线观看 | 国产超碰在线观看 | 伊人天天操| 99久久久国产免费 | 精品一区 在线 | 中文字幕av网站 | 蜜臀久久99精品久久久久久网站 | 日韩网| 国产看片网站 | 亚洲黄色一级电影 | 日韩高清在线一区二区三区 | 日韩久久久 | 丁香电影小说免费视频观看 | 国产韩国精品一区二区三区 | 国产精品资源在线观看 | 国产三级午夜理伦三级 | 91高清不卡 | 狠狠的干狠狠的操 | 欧美精品在线免费 | 超碰在线最新网址 | 国产资源在线播放 | 91精品对白一区国产伦 | 亚洲成aⅴ人片久久青草影院 | 久久久精华网 | 国产精品久久婷婷六月丁香 | 亚洲国产视频在线 | 久久a v视频 | 久久噜噜少妇网站 | 婷婷爱五月天 | 中文字幕精品视频 | 国产精品理论片在线观看 | 黄色看片 | 在线国产片 | 99婷婷| 日韩电影精品一区 | 久久久人 | 免费国产视频 | 国产精品一区二区你懂的 | 精品在线视频观看 | 久久av伊人 | 最新亚洲视频 | 国产精品久久久久久久久久ktv | 五月激情亚洲 | 五月情婷婷 | 久久国产精品精品国产色婷婷 | 亚洲色图色 | 成人黄大片视频在线观看 | 在线看免费 | 99免在线观看免费视频高清 | 手机看片中文字幕 | 久久国产精品免费看 | 中文字幕资源在线 | 在线观看国产福利片 | 日韩高清在线一区二区 | 中文字幕在线观看免费高清完整版 | 天天色棕合合合合合合 | 国产在线观看免费 | 欧美不卡在线 | 国产 色 | 伊人久操 | www.久久精品视频 | 日本黄色大片免费 | bbbbb女女女女女bbbbb国产 | 911亚洲精品第一 | 九九久久久久久久久激情 | 日韩中文字幕亚洲一区二区va在线 | 69av网| 免费看的毛片 | 亚洲免费在线视频 | 色婷婷亚洲 | 久久xx视频 | 99操视频| 日韩在线观看中文字幕 | 婷婷伊人五月 | 黄色软件网站在线观看 | 丁香 婷婷 激情 | 丁香婷婷激情啪啪 | 久草久视频 | 国内精品久久久久 | 91精品日韩| 国产精品一区在线观看 | 亚洲视频在线看 | 久久久九色精品国产一区二区三区 | 韩国精品福利一区二区三区 | 久久久久久综合 | 免费在线观看污网站 | 午夜 久久 tv | 天天操狠狠操网站 | 九九久久电影 | 人人爱爱人人 | 天天色宗合| 国产精品毛片久久 | 久久高清国产视频 | 成人三级网站在线观看 | 丁香婷婷深情五月亚洲 | 欧美日韩视频在线观看免费 | 91av在线不卡 | 在线观看免费观看在线91 | 亚洲免费在线播放视频 | 在线观看色网 | 日韩艹 | 国内精品久久久久久久 | 天天操天天怕 | 国产黄a三级三级三级三级三级 | 午夜三级大片 | 久草在线这里只有精品 | 免费观看的黄色片 | 在线国产不卡 | 福利一区在线视频 | 99色视频在线 | 草久在线 | 天天激情综合网 | 99精品久久久久久久 | av在线播放一区二区三区 | 日韩在线视频网 | 久久国产精品一区二区 | 97视频免费看 | 国产高清免费在线播放 | 日韩中文在线视频 | 成人动图 | 香蕉网在线观看 | 国产一区二区三区网站 | 中文字幕在线免费播放 | 三级av小说 | 久久亚洲私人国产精品va | 亚洲精品理论 | 国产麻豆精品95视频 | 国产亚洲精品中文字幕 | 99 久久久久 | 国产精品亚洲精品 | 久操视频在线 | 国产一区二区在线观看免费 | 黄色成人影院 | 婷婷国产一区二区三区 | 欧美三级高清 | 四虎国产精品成人免费影视 | 91精品国产麻豆国产自产影视 | 免费高清国产 | av网站免费在线 | 青青五月天| 日本夜夜草视频网站 | 天天操天天色天天射 | 久久久久国产一区二区 | 91中文在线视频 | 久久美女高清视频 | 欧美韩日在线 | 亚洲欧美日韩精品久久奇米一区 | 婷香五月 | 91av视频导航| 国产一区在线播放 | 欧洲激情在线 | 天天干天天操av | 亚洲精品国精品久久99热 | 国产在线永久 | 成人性生交大片免费看中文网站 | 久久免费看 | 久久久蜜桃 | 97爱爱爱 | 五月天国产精品 | 天天人人综合 | 91资源在线观看 | 免费av片在线| 欧美精品在线视频观看 | 日韩一区精品 | 91成版人在线观看入口 | 操久| a成人v | 91激情在线视频 | 免费色视频网址 | 啪啪av在线 | 国产69精品久久久久99尤 | 丁香六月在线观看 | 免费三级黄色 | 国产精品成人av在线 | 国内丰满少妇猛烈精品播放 | 国产一区成人 | 亚洲在线激情 | 射久久 | 99热都是精品| 在线观看的a站 | 久草手机视频 | 欧美日韩免费观看一区二区三区 | 久久6精品 | 射久久久 | 99久久成人 | 伊人成人久久 | 色视频网站免费观看 | 人人干狠狠操 | 国产香蕉97碰碰碰视频在线观看 | 操操爽 | 精品久久久久久一区二区里番 | 香蕉视频在线视频 | 婷婷四房综合激情五月 | 丁香激情综合国产 | 日韩在线电影 | 综合在线亚洲 | 欧美动漫一区二区三区 | 亚洲婷婷综合色高清在线 | 人人玩人人弄 | 亚洲永久精品在线 | 久久69av| 久久国产高清视频 | 欧美日韩精品在线播放 | 天天射综合网站 | 国产一区二区三区四区大秀 | 成人久久久久久久久 | 天天干天天插 | 国产成人精品日本亚洲999 | 视频二区| 午夜三级大片 | 日本最新一区二区三区 | 狠狠狠干狠狠 | 久久久资源网 | 久久看片 | 四虎国产精品永久在线国在线 | 亚洲精区二区三区四区麻豆 | 人人爽人人爽人人片av免 | 日韩视频在线一区 | 日韩免费av在线 | 1024手机基地在线观看 | 在线观看av大片 | 午夜精品视频一区二区三区在线看 | 久草视频播放 | 美女网站在线 | 97超碰色偷偷 | 色综合久久久久综合 | 天天草天天 | 亚洲第一区在线观看 | 国产精品一区二区久久国产 | 亚洲一区不卡视频 | 2019精品手机国产品在线 | 国产一区二区不卡在线 | 色播激情五月 | 综合五月婷婷 | 欧美日韩视频在线一区 | 天天射天天艹 | 性色av一区二区三区在线观看 | 免费在线电影网址大全 | 国产资源网 | 久久国产精品系列 | 国产韩国日本高清视频 | 久久精品男人的天堂 | 91精品国产91久久久久久三级 | 天天综合日 | 国产精品18久久久久久不卡孕妇 | 国产日韩视频在线观看 | 久久久综合九色合综国产精品 | 中文国产字幕在线观看 | 99久久精品免费视频 | 国产网站色 | 色国产精品一区在线观看 | 在线免费观看av网站 | 草久中文字幕 | 怡红院av久久久久久久 | 亚洲综合成人专区片 | 国产精品久久久久9999吃药 | 4438全国亚洲精品观看视频 | 在线视频免费观看 | www.夜夜爽 | 国内精品国产三级国产aⅴ久 | 免费在线视频一区二区 | 久草手机视频 | 日韩试看 | 久久草网站 | 91传媒91久久久 | 日韩精品在线视频免费观看 | 亚洲成熟女人毛片在线 | 欧美 国产 视频 | 日韩在线三级 | 91超在线| 亚洲精品国产成人 | 激情久久一区二区三区 | 国产在线不卡 | 特黄特色特刺激视频免费播放 | 久久久国产精品免费 | 在线观看深夜视频 | 国产精品久久久久久久久久 | 成人午夜电影免费在线观看 | 亚洲成人一二三 | 亚洲视屏在线播放 | 日韩激情影院 | 国产日韩欧美中文 | 亚洲最大av在线播放 | 亚洲综合视频在线 | 天天干,天天草 | 久久国产精品99久久久久久老狼 | 中文字幕在线资源 | 日韩在线播放视频 | 99精品免费久久久久久久久 | 欧美最猛性xxxxx亚洲精品 | 亚洲情感电影大片 | av一级在线 | 亚洲永久精品一区 | 日本中文字幕免费观看 | 又爽又黄在线观看 | 欧美韩国日本在线 | 日韩在线高清免费视频 | 手机看片国产日韩 | 天天舔天天射天天操 | 婷婷色综合 | 亚洲欧美视频 | 久久99精品久久久久久久久久久久 | 狠狠操电影网 | 成人久久精品 | 高清国产午夜精品久久久久久 | 在线观看国产日韩 | 久久免费在线观看 | 中文成人字幕 | 亚洲人人精品 | 日韩和的一区二在线 | 91大神在线观看视频 | 国产精品精品国产婷婷这里av | 91福利小视频 | 欧美一区二区三区在线视频观看 | 国产精品久久久久久久久久久久午夜片 | 亚洲视频网站在线观看 | 中文字幕在线观看视频一区 | 欧美日韩三区二区 | 美女国产 | 欧美日韩一区二区三区视频 | 亚洲国产中文字幕在线视频综合 | 香蕉影视 | 日日碰夜夜爽 | 夜夜视频资源 | 免费av在 | 国产一级久久 | 欧美午夜寂寞影院 | 国产美女视频一区 | 我要色综合天天 | 国产无吗一区二区三区在线欢 | 国产精品久久av | 欧美成人精品xxx | 91在线免费视频 | 国产在线观看你懂得 | 免费91麻豆精品国产自产在线观看 | 日韩av在线免费看 | 国产精品久久久久久一二三四五 | 国产成人黄色av | 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲精品乱码久久久久久蜜桃91 | 色网免费观看 | 日韩大片免费在线观看 | 久久久久久蜜桃一区二区 | 在线观看免费版高清版 | 精品一二 | 久久视影 | 夜又临在线观看 | 五月婷婷,六月丁香 | 欧美在线一二 | 国产欧美日韩精品一区二区免费 | 久久久久日本精品一区二区三区 | 国产成人久久精品77777综合 | 国产精品99久久久久的智能播放 | 久久黄色小说视频 | 精品一区二区视频 | 91视频首页| 激情网站网址 | 青青草在久久免费久久免费 | 久久国产精品二国产精品中国洋人 | 黄色大片日本 | 1区2区视频 | 免费黄在线看 | 日韩免费一区 | 久久国产精品一二三区 | 亚洲国产午夜 | 国产精品一区二区三区久久久 | 成人午夜精品 | 国产对白av | 狠狠狠色丁香综合久久天下网 | 久久免费黄色大片 | 激情综合一区 | 手机av网站 | 婷婷去俺也去六月色 | 九九热av | 欧美二区视频 | 五月激情站 | 在线观看www. | 中文字幕在线观看1 | 色天天综合久久久久综合片 | 久久久久久高潮国产精品视 | 日日夜夜亚洲 | 在线亚洲播放 | 国产精品99久久久久久有的能看 | 久久久久国产精品一区 | 日韩在线资源 | 99热99re6国产在线播放 | 丁香六月中文字幕 | 欧美精品在线视频 | av短片在线观看 | 色视频国产直接看 | 91精品国产福利在线观看 | 精品在线观看一区二区 | 伊人导航| 五月婷婷激情综合 | 国产亚洲va综合人人澡精品 | 久草在线资源免费 | 五月婷在线观看 | 美女国内精品自产拍在线播放 | 国产一区二区三区 在线 | 午夜手机电影 | 国产成人一二片 | 中文字幕亚洲精品在线观看 | 免费黄色av | 日韩高清 一区 | 韩国av一区二区 | 最新婷婷色 | 国产a级片免费观看 | 欧美性网站 | 久久综合色一综合色88 | 成人在线观看资源 | 四虎天堂 | 亚洲高清久久久 | 91在线观看欧美日韩 | 中文字幕亚洲欧美 | 99中文字幕视频 | 九九99 | 欧美在线一二区 | 成人av电影网址 | 久久久久一区二区三区四区 | 久久久精品福利视频 | 免费看三级黄色片 | 日韩在线视频不卡 | 少妇性aaaaaaaaa视频 | 成人av片免费观看app下载 | 久久久久久久网 | 天天操天天操天天爽 | 天天射天天干 | 亚洲国产一区二区精品专区 | 日韩精品大片 | 亚洲人成网站精品片在线观看 | 一级淫片在线观看 | 日韩a级免费视频 | 91麻豆精品久久久久久 | 国产精品久久久久久久久久直播 | 在线视频日韩一区 | 久久影院午夜论 | 最近乱久中文字幕 | 日本中文字幕视频 | 蜜桃麻豆www久久囤产精品 | 亚洲成a人片在线观看网站口工 | 最新av在线播放 | 特级毛片网 | 久久国际影院 | 中文字幕之中文字幕 | 国产剧情一区在线 | 超碰人人在线观看 | 韩国精品在线观看 | 91成人免费在线 | 狠狠色狠狠综合久久 | 亚洲精品成人av在线 | 中文字幕av最新更新 | 国产在线更新 | 在线午夜电影神马影院 | 久草a在线 | 成人a视频| 日韩区欠美精品av视频 | 久久视频在线观看中文字幕 | 黄网站免费看 | 亚洲国产欧洲综合997久久, | 伊人狠狠色丁香婷婷综合 | 成人一区二区三区中文字幕 | 在线v片免费观看视频 | 在线精品国产 | 国产在线观看污片 | 日韩av一区二区三区在线观看 | 亚洲国产剧情av | 99色网站 | 91精品一区二区在线观看 | 国产精品久久久久久超碰 | 91av蜜桃| 一区二区三区在线视频观看58 | 免费精品在线视频 | 久久综合中文字幕 | 毛片www| 成人午夜片av在线看 | 久久免费美女视频 | 日韩中文久久 | 丁香六月久久综合狠狠色 | 日韩久久午夜一级啪啪 | 日韩av一卡二卡三卡 | 国产精品国产精品 | 在线观看成人国产 | 在线观看911视频 | 精品福利视频在线 | 久久久免费观看完整版 | 精品成人网 | 四虎影视久久久 | 国产一二三四在线观看视频 | 日韩有码在线播放 | 免费视频黄 | 色综合久久综合 | 国产在线播放一区 | 欧美日韩不卡在线 | 国产特级毛片aaaaaa | 色天天天 | 肉色欧美久久久久久久免费看 | 日韩精品一区二区电影 | 久草在线高清视频 | 丁香5月婷婷久久 | 久久不射网站 | 久久激情视频 久久 | 国产成人高清在线 | 欧美日韩久久不卡 | 国产精品久久久久久爽爽爽 | 精品免费观看视频 | 欧美色一色 | 日韩激情av在线 | 天天艹天天爽 | 亚洲va在线va天堂va偷拍 | 国产视频亚洲精品 | 亚洲视屏 | 麻豆视频国产精品 | 骄小bbw搡bbbb揉bbbb | 色噜噜在线观看 | 日日天天av | 天天插天天操天天干 | 久久久精品 一区二区三区 国产99视频在线观看 | 久久99精品久久久久久久久久久久 | 97免费中文视频在线观看 | 天天狠狠操 | 日韩免费av片 | 麻豆视频国产精品 | 精品国产乱码久久久久久浪潮 | 成人免费视频视频在线观看 免费 | 欧美天天综合网 | 久久国产高清 | 欧美日韩亚洲国产一区 | 四虎国产精品成人免费4hu | 精品视频免费 | 久久国产香蕉视频 | 精品国产诱惑 | av福利网址导航大全 | 亚洲精品一区二区三区四区高清 | 午夜av网站| 黄网站色成年免费观看 | 久久精品国产免费看久久精品 | 国产日韩视频在线观看 | av免费线看 | 国产成人久久精品 | 在线观看视频黄 | 欧美黄色高清 | 99久久精品国产一区二区成人 | 又大又硬又黄又爽视频在线观看 | 日本婷婷色 | 欧美另类亚洲 | 97视频网址 | 成人h电影在线观看 | 精品9999| 国产成人免费在线观看 | 亚洲国产精品999 | 91传媒激情理伦片 | 亚洲精品日韩一区二区电影 | 欧美在线观看视频免费 | 精品久久久精品 | 婷婷电影在线观看 | 米奇四色影视 | 综合婷婷 | 久久精品国产精品亚洲 | 特级西西444www大精品视频免费看 | av中文国产| 91国内在线 | 国产久草在线 | 欧美日韩超碰 | 伊人国产视频 | 久久国产精彩视频 | 91视频在线播放视频 | 国产无套一区二区三区久久 | 亚洲精品国产第一综合99久久 | 五月天六月丁香 | 自拍超碰在线 | 人人干天天射 | 一区二区三区免费在线播放 | 五月天精品视频 | 亚洲电影成人 | 九九视频在线观看视频6 | 国产一区二区在线视频观看 | 久久久高清免费视频 | 在线视频观看成人 | 亚洲传媒在线 | 一级黄色片在线观看 | 成人久久免费视频 | 久久人网 | 91香蕉视频在线下载 | 午夜视频在线网站 | 手机看片国产日韩 | 首页国产精品 | 一级片色播影院 | 正在播放久久 | 国产毛片久久久 | 亚洲精品视频二区 | freejavvideo日本免费 | a√天堂中文在线 | 99久久er热在这里只有精品66 | 亚洲综合网站在线观看 | 婷婷国产精品 | 国产高清综合 | 麻豆91网站| 在线电影 一区 | 久久免费av | 色综合夜色一区 | 亚洲影视九九影院在线观看 | 久久久高清一区二区三区 | 日韩在线视频不卡 | 成人在线播放免费观看 | 国产99久久精品 | 亚洲色五月 | 一本色道久久综合亚洲二区三区 | 中文欧美字幕免费 | 日韩最新中文字幕 | 欧美综合国产 | av中文电影 | 色黄视频免费观看 | 欧美精品免费一区二区 | 欧美最猛性xxxxx(亚洲精品) | 久久精品视频在线看 | 久久999精品 | 国内精品久久久久影院日本资源 | 国产精品正在播放 | 国产午夜精品一区二区三区四区 | 日韩在线观看视频在线 | 亚洲精品美女久久久久网站 | 日韩电影一区二区在线观看 | bbb搡bbb爽爽爽| 久久久久亚洲精品 | www.一区二区三区 | 日本久久久久久科技有限公司 | 精品你懂的 | 在线观看日本韩国电影 | 成人h视频在线播放 | 国产成人99av超碰超爽 | 在线观看黄色国产 | 91成人亚洲| 五月婷婷一区 | 中午字幕在线观看 | 在线视频 一区二区 | 久久精品国产精品亚洲精品 | 欧美一区成人 | www免费看片com | 色福利网站 | 日日爽夜夜爽 | 91精品国产91热久久久做人人 | 玖玖爱国产在线 | 日韩在线精品一区 | 中文字幕在线观看免费观看 | 成人黄色免费观看 | 中文久草 | 亚洲视频在线免费观看 | 国产亚洲精品精品精品 | 91在线免费播放 | 日韩精品视频在线观看网址 | 国产亚洲精品日韩在线tv黄 | 中文字幕av免费 | 狠狠操精品 | 黄色一级大片免费看 | 美女视频一区二区 | 麻豆久久久久久久 | 国产午夜一级毛片 | 国产美女视频网站 | a'aaa级片在线观看 | 国产 色| 在线亚洲人成电影网站色www | 久久美女电影 | 瑞典xxxx性hd极品 | 国产精品成人久久久久久久 | 亚洲精品在线观看免费 | 亚洲在线综合 | 日韩精品视频在线观看免费 | 免费看片在线观看 | 午夜丰满寂寞少妇精品 | 韩国av免费观看 | 亚洲,国产成人av | 久久天天躁夜夜躁狠狠躁2022 | 一二三区在线 | 全黄网站 | 在线免费观看黄网站 | 亚洲综合色丁香婷婷六月图片 | 最近中文字幕在线中文高清版 | 国产精品亚洲精品 | 日韩在线视频一区 | 日韩免费视频线观看 | 亚洲精品免费播放 | 深夜免费福利视频 | 一本色道久久精品 | 亚州天堂 | 亚洲精品乱码久久久久v最新版 | 亚洲国产精品第一区二区 | 天天插狠狠干 | 五月天丁香 | 国产精品午夜在线观看 | 在线观看日韩免费视频 | 天天操夜夜操夜夜操 | 五月婷色 | 999久久久久久久久6666 | 日韩免费在线观看视频 | 99久久99久国产黄毛片 | 99久久精品免费一区 | 久久久免费在线观看 | 日本中文在线 | 中文字幕在线久一本久 | 一本一本久久a久久精品牛牛影视 | 女人高潮特级毛片 | 久久久国产一区二区三区 | 99色在线播放| 在线视频观看你懂的 | 丁香av在线| 国产精品欧美一区二区三区不卡 | 在线亚洲激情 | 91视频国产高清 | 免费看片亚洲 | 国产伦理久久精品久久久久_ | 国产精品av一区二区 | 欧美成a人片在线观看久 | 狠狠狠干| 99精品国自产在线 | 亚洲精品视频在线观看免费视频 | 国产一区二区精品久久 | 日韩高清不卡一区二区三区 | 一区二区三区不卡在线 | 中文字幕在线看视频 | 久草成人在线 | 久久国产一二区 | 99热最新精品 | 亚洲欧美日韩精品一区二区 | 日韩精品一区二区三区高清免费 | 中文字幕 国产专区 | 亚洲jizzjizz日本少妇 | 美国三级黄色大片 | 狠狠色噜噜狠狠狠狠 | 久久久久伦理电影 | 视频在线精品 | 精品久久久久久电影 | 成人免费在线电影 | 日韩xxxbbb| 胖bbbb搡bbbb擦bbbb | 在线观看91网站 | 亚洲国产精品一区二区久久hs | 最新av免费在线观看 | 亚洲激情国产精品 | 国产精品av电影 | 天堂中文在线播放 | 免费在线观看毛片网站 | 亚洲精品va | 91刺激视频 | 99久久精品日本一区二区免费 | 99在线视频播放 | 亚洲电影久久久 | 黄色一区二区在线观看 | 成年人免费在线观看网站 | av高清免费在线 | 日韩大片在线 | 国产特级毛片aaaaaaa高清 | 日本久久不卡视频 | 免费色网站 | 玖玖在线视频观看 | 亚洲91在线| 成人a视频在线观看 | 精品久久久久久久久久久久久 | 91在线视频播放 | 国产精品永久在线 | av黄色在线播放 | 亚洲午夜电影网 | 欧美精品一区二区性色 | 91精品国产92久久久久 | 国产91小视频 | 狠狠干夜夜操天天爽 | 9幺看片| 国产 一区二区三区 在线 | 免费观看久久久 | 99视频偷窥在线精品国自产拍 | 又黄又爽又湿又无遮挡的在线视频 | 亚洲最新毛片 | 精品国内自产拍在线观看视频 | 日韩在线视频一区 | 日韩精品视频免费在线观看 | 欧美激情综合五月 | 精品国产一区二区三区噜噜噜 | 中文字幕黄色网 | 久久线视频| 波多野结衣精品在线 | 亚洲综合视频在线播放 | 日韩中文字幕在线看 | 日韩中文字幕视频在线观看 | 精品视频在线看 | 午夜婷婷网| 国产精品麻 | 国产无区一区二区三麻豆 | av电影中文 | 超碰在线公开 | 婷婷在线视频观看 | 精品美女在线视频 | 狠狠激情中文字幕 | 久久国产成人午夜av影院潦草 | www视频免费在线观看 | 国产性天天综合网 | 日韩欧美专区 | 91在线永久 | 日韩国产欧美在线视频 | 精品嫩模福利一区二区蜜臀 | 色噜噜狠狠狠狠色综合 |