青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Just enjoy programming

#

c++設計模式(九) 抽象工廠(Abstract Factory)

      抽象工廠(Abstract Factory)模式看起來和前面看到的工廠方法很相似,只是它使用若干工廠方法(Factory Method)模式。每個工廠方法模式創建一個不同類型的對象。當創建一個工廠對象時,要決定將如何使用由那個工廠創建的所有對象。示例代碼如下(假設要創建一個通用的游戲環境,并且希望它能支持不同類型的游戲):
#include<iostream>
using namespace std;

class Obstacle
{
public:
    virtual void action()=0;
};

class Player
{
public:
    virtual void interactWith(Obstacle*)=0;
};

class Kitty: public Player
{
    virtual void interactWith(Obstacle *ob)
    {
        cout<<"Kitty has encountered a";
        ob->action();
    }
};

class KungFuGuy: public Player
{
    virtual void interactWith(Obstacle* ob)
    {
        cout<<"KungFuGuy now battles against a";
        ob->action();
    }
};
class Puzzle: public Obstacle
{
public:
    void action(){cout<<"Puzzle"<<endl;}
};

class NastyWeapon: public Obstacle
{
public:
    void action(){cout<<"NastyWeapon"<<endl;}
};

//the abstract factory
class GameElementFactory
{
public:
    virtual Player* makePlayer()=0;
    virtual Obstacle* makeObstacle()=0;
};

//concreate factories
class KittiesAndPuzzles:public GameElementFactory
{
public:
    virtual Player* makePlayer(){return new Kitty;}
    virtual Obstacle * makeObstacle(){return new Puzzle;}
};

class KillAndDismember:public GameElementFactory
{
public:
    virtual Player* makePlayer(){return new KungFuGuy;}
    virtual Obstacle *makeObstacle(){return new NastyWeapon;}
};


class GameEnvironment
{
    GameElementFactory* gef;
    Player* p;
    Obstacle *ob;
public:
    GameEnvironment(GameElementFactory * factory)
        :gef(factory),p(factory->makePlayer()),ob(factory->makeObstacle()){}
    void play(){p->interactWith(ob);}
    ~GameEnvironment()
    {
        delete p;
        delete ob;
        delete gef;
    }
};

int main()
{
    GameEnvironment
        g1(new KittiesAndPuzzles),
        g2(new KillAndDismember);
    g1.play();
    g2.play();
}

在此環境中,Player對象與Obstacle 對象交互,但是Player和Obstacle類型依賴于具體的游戲。可以選擇特定的GameElementFactory來決定游戲的類型,然后GameEnvironment控制游戲的設置和進行。在本例中,游戲的設置和進行很簡單,但是那些動作在很大程度上決定了游戲的結果。

posted @ 2011-05-03 23:40 周強 閱讀(388) | 評論 (0)編輯 收藏

c++設計模式(八) 工廠模式:封裝對象的創建

     工廠模式不允許將創建對象的代碼散布于整個系統。如果程序中所有需要創建對象的代碼都轉到這個工廠執行,那么在增加新對象時所要做的全部工作就是只需修改工廠。這種設計時眾所周知的工廠方法模式的一種變體。由于每個面向對象應用程序都需要創建對象,并且由于人們可能通過添加新類型來擴展應用程序,工廠模式可能是所有設計模式中最有用的模式之一。實現工廠模式的一種方法就是在基類中定義一個靜態成員函數,示例如下:
#include<iostream>
#include<stdexcept>
#include<cstddef>
#include<string>
#include<vector>

using namespace std;

class Shape
{
public:
    virtual void draw()=0;
    virtual void erase()=0;
    virtual ~Shape(){}
    class BadShapeCreation :public logic_error
    {
    public:
        BadShapeCreation(string type):
            logic_error("Cannot create type"+type){}
    };
    static Shape* factory(const string &type)
        throw(BadShapeCreation);
};

class Circle:public Shape
{
    Circle(){}
    friend class Shape;
public:
    void draw(){cout<<"Circle::draw"<<endl;}
    void erase(){cout<<"Circle::erase"<<endl;}
    ~Circle(){cout<<"Circle::~Circle"<<endl;}
};

class Square:public Shape
{
    Square(){}
    friend class Shape;
public:
    void draw(){cout<<"Square::draw"<<endl;}
    void erase(){cout<<"Square::erase"<<endl;}
    ~Square(){cout<<"Square::~Square"<<endl;}
};

Shape *Shape::factory(const string & type)
    throw(Shape::BadShapeCreation)
{
    if(type=="Circle")return new Circle;
    if(type=="Square")return new Square;
    throw BadShapeCreation(type);
}

char *sl[]={"Circle","Square","Square","Circle","Circle","Circle","Square"};

int main()
{
    vector<Shape*>shapes;
    try{
        for(size_t i=0;i<sizeof sl/sizeof sl[0];i++)
            shapes.push_back(Shape::factory(sl[i]));
    }catch(Shape::BadShapeCreation e)
    {
        cout<<e.what()<<endl;
        return -1;
    }
    for(size_t i=0;i<shapes.size();i++)
    {
        shapes[i]->draw();
        shapes[i]->erase();
    }
}

函數factory 允許以一個參數來決定創建何種類型的Shape。在這里,參數類型為string,也可以是任何數據集。為了確保對象的創建只能發生在函數factory()中,Shape的特定類型的構造函數被設為私有,同時Shape被聲明為友元類,因此factory()能夠訪問這些構造函數。

參考: C++編程思想卷2

posted @ 2011-05-03 23:12 周強 閱讀(1530) | 評論 (0)編輯 收藏

c++設計模式(七) 職責鏈模式:嘗試采用一系列策略模式

      職責鏈(Chain of Responsibility)模式也許被看做一個使用策略對象的“遞歸的動態一般化".此時提出一個調用,在一個鏈序列中的每個策略都試圖滿足這個調用。這個過程直到有一個策略成功滿足該調用或者到達序列的末尾才結束。在遞歸方法中,有個函數反復調用其自身至達到某個終止條件。在職責鏈中,一個函數調用自身,(通過遍歷策略鏈)調用函數的一個不同實現,如此反復直至達到某個終止條件。這個終止條件或者是已達到策略鏈的底部(這樣就會返回一個默認對象;不管能否提供這個默認結果,必須有個方法能夠決定該職責鏈搜索是成功還是失?。┗蛘呤浅晒φ业揭粋€策略。
     除了調用一個函數來滿足某個請求以外,鏈中的多個函數都有此機會滿足某個請求,因此它有點專家系統的意味。由于職責鏈實際上就是一個鏈表,它能夠動態創建,因此它可以看做是一個更一般的動態構建的switch語句。示例代碼如下:
#include<iostream>
#include<vector>

using namespace std;


enum Answer{NO,YES};

class GimmeStrategy
{
    public:
        virtual Answer canIHave()=0;
        virtual ~GimmeStrategy(){}
};

class AskMom: public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Moom? can I have this?"<<endl;
            return NO;
        }
};

class AskDad: public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Dad,I really need this!"<<endl;
            return NO;
        }
};


class AskGrandpa:public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Grandpa , is it my birthday yet?"<<endl;
            return NO;
        }
};

class AskGrandma:public GimmeStrategy
{
    public:
        Answer canIHave()
        {
            cout<<"Grandma,I really love you!"<<endl;
            return YES;
        }
};

class Gimme:public GimmeStrategy
{
    vector<GimmeStrategy*>chain;
    public:
        Gimme(){
            chain.push_back(new AskMom());
            chain.push_back(new AskDad());
            chain.push_back(new AskGrandpa());
            chain.push_back(new AskGrandma());
        }
        Answer canIHave()
        {
            vector<GimmeStrategy*>::iterator it=chain.begin();
            while(it!=chain.end())
                if((*it++)->canIHave()==YES)
                    return YES;
            cout<<"whiiiiiinnne!"<<endl;
            return NO;
        }
        ~Gimme(){};
};

int main()
{
    Gimme chain;
    chain.canIHave();
}


參考 :c++編程思想卷二

posted @ 2011-05-03 14:01 周強 閱讀(701) | 評論 (1)編輯 收藏

c++設計模式(六)策略模式:運行時選擇算法

       前面模板方法模式是“堅持相同的代碼“,而被覆蓋的函數是“變化的代碼“。然而,這種變化在編譯時通過繼承被固定下來。按照“組合優于繼承“的格言,可以利用組合來解決將變化的代碼從“堅持相同的代碼“中分開的問題,從而產生策略(Strategy)模式。這種方法的一個明顯的好處:在程序運行時,可以插入變化的代碼。策略模式也加入“語境“,它可以是一個代理類,這個類控制著對特定策略對象的選擇和使用。
       “策略“的意思就是:可以使用多種方法來解決某個問題,即條條大陸通羅馬?,F在考慮一下忘記了某個人姓名時的情景。這里的程序可以用不同方法解決這個問題,實例代碼如下:
#include<iostream>

using namespace std;

class NameStrategy
{
    public:
        virtual void greet()=0;
};

class SayHi: public NameStrategy
{
    public:
        void greet()
        {
            cout<<"Hi! How's it going?"<<endl;
        }
};

class Ignore: public NameStrategy
{
    public:
        void greet()
        {
            cout<<"Pretend I don't see you)"<<endl;
        }
};

class Admission:public NameStrategy
{
    public:
        void greet()
        {
            cout<<"I'm sorry ,I forgot your name."<<endl;
        }
};

class Context
{
    NameStrategy & strategy;
    public:
        Context(NameStrategy & strat):strategy(strat){}
        void greet(){strategy.greet();}
};


int main()
{
    SayHi sayhi;
    Ignore ignore;
    Admission admission;
    Context c1(sayhi),c2(ignore),c3(admission);
    c1.greet();
    c2.greet();
    c3.greet();

}

Context::greet()可以正規地寫得更加復雜些,它類似模板方法模式,因為其中包含了不能改變的代碼。但在函數main()中可以看到,可以在運行時就策略進行選擇。更進一步的做法??梢詫顟B模式與Context對象的生存期間變化的策略模式結合起來使用。

posted @ 2011-05-03 11:33 周強 閱讀(754) | 評論 (0)編輯 收藏

c++設計模式(五)模板方法模式

       應用程序結構框架允許從一個或一組類中繼承以便創建一個新的應用程序,重用現存類中幾乎所有的代碼,并且覆蓋其中一個或多個函數以便自定義所需要的應用程序。應用程序結構框架中的一個基本的概念是模板方法模式,它很典型地隱藏在覆蓋的下方,通過調用基類的不同函數來驅動程序運行。
      模板方法模式的一個重要特征是它的定義在基類中(有時作為一個私有成員函數)并且不能改動,模板方法模式就是“堅持相同的代碼“。它調用其他基類函數(就是那些被覆蓋的函數)以便完成其工作,但是客戶程序員不必直接調用這些函數。驅動應用程序運行的“引擎”是模板方法模式,示例代碼如下:
#include<iostream>

using namespace std;

class ApplicationFramework
{
    protected :
        virtual void customize1()=0;
        virtual void customize2()=0;
    public:
        void templateMethod()
        {
            for(int i=0;i<5;i++)
            {
                customize1();
                customize2();
            }
        }
};

class MyApp: public ApplicationFramework
{
    protected:
        void customize1(){cout<<"Hello";}
        void customize2(){cout<<"World!"<<endl;}
};

int main()
{
    MyApp app;
    app.templateMethod();

}

參考:c++編程思想卷二

posted @ 2011-05-03 11:15 周強 閱讀(507) | 評論 (0)編輯 收藏

c++設計模式(四)適配器(Adapter)模式

適配器(Adapter)模式接受一種類型并且提供一個對其他類型的接口。當給定一個庫或者具有某一接口的一段代碼,同事還給定另外一個庫或者與前面那段代碼的基本思想相同的一段代碼而只是表達式不一致時,適配器模式將十分有用。通過調整彼此的表達方式來適配彼此,將會迅速產生解決方法。

實例代碼如下:
//FibonacciGenerator.h, 斐波那契數列產生器類

#ifndef FIBONACCIGENERATOR_H
#define FIBONACCIGENERATOR_H

class FibonacciGenerator
{
    int n;
    int val[2];
    public:
        FibonacciGenerator():n(0){val[0]=val[1]=0;}
        int operator()()
        {
            int result=n>2?val[0]+val[1]:n>0?1:0;
            ++n;
            val[0]=val[1];
            val[1]=result;
            return result;
        }
        int count(){return n;}
};
#endif

也許讀者希望利用這個產生器來執行STL數值算法操作。遺憾的是,STL算法只能使用迭代器才能工作,這就存在接口不匹配的問題。解決方法就是產生一個適配器。代碼如下。
#include<iostream>
#include<numeric>
#include"FibonacciGenerator.h"

using namespace std;

class FibonacciAdapter
{
    FibonacciGenerator f;
    int length;
    public:
        FibonacciAdapter(int size):length(size){}
        class iterator;
        friend class iterator;
        class iterator:public std::iterator<std::input_iterator_tag,FibonacciAdapter,ptrdiff_t>
        {
            FibonacciAdapter& ap;
            public:
                typedef int value_type;
                iterator(FibonacciAdapter &a):ap(a){}
                bool operator==(const iterator &)const{
                    return ap.f.count()==ap.length;
                }
                bool operator!=(const iterator &x)const
                {
                    return !(*this==x);
                }

                int operator*()const{return ap.f();}
                iterator& operator++(){return *this;}
                iterator operator++(int){return *this;}
        };
        iterator begin(){return iterator(*this);}
        iterator end(){return iterator(*this);}
};

int main()
{
    const int SZ=20;
    FibonacciAdapter a1(SZ);
    cout<<"accumulate:"<<accumulate(a1.begin(),a1.end(),0)<<endl;
}



posted @ 2011-05-03 10:49 周強 閱讀(372) | 評論 (0)編輯 收藏

c++設計模式(三)代理模式(Proxy)與狀態模式(State)模式

      代理(Proxy)模式,狀態(State)模式都提供一個代理類。代碼與代理類打交道,而實際工作的類隱藏在代理類背后。當調用代理類中的一個函數時,代理類僅轉而去調用實現類中的相應的函數。這兩種模式是如此相似,從結構上看,可以認為代理模式只是狀態模式的一個特例。但是這兩個模式的內涵是不一樣的。
      基本思想很簡單:代理類派生來自一個基類,由平行地派生來自同一個基類的一個或多個類提供實際的實現。當一個代理對象被創建的時候,一個實現對象就分配給了它,代理對象就將函數調用發給實現對象。
      從結構上來看,代理模式和狀態模式的區別很簡單:代理模式只有一個實現類,而狀態模式有多個(一個以上)實現。認為這兩種設計模式的應用也不同:代理模式控制對其實現類的訪問,而狀態模式動態地改變其實現類。
(1)代理模式例子:
#include<iostream>

using namespace std;

class ProxyBase
{
    public:
        virtual void f()=0;
        virtual void g()=0;
        virtual void h()=0;
        virtual ~ProxyBase(){}
};


class Implementation :public ProxyBase
{
    public:
        void f(){cout<<"Implementation.f()"<<endl;}
        void g(){cout<<"Implementation.g()"<<endl;}
        void h(){cout<<"Implementation.h()"<<endl;}
};


class Proxy: public ProxyBase
{
    ProxyBase *implementation;
    public:
        Proxy(){implementation=new Implementation();}
        ~Proxy(){delete implementation;}


        void f(){implementation->f();}
        void g(){implementation->g();}
        void h(){implementation->h();}
};

int main()
{
    Proxy p;
    p.f();
    p.g();
    p.h();
}

(2)狀態模式
#include<iostream>

using namespace std;

class Creature
{
    class State
    {
        public:
            virtual string response()=0;
    };

    class Frog : public State
    {
        public:
            string response(){return "Ribbet!";}
    };

    class Prince:public State
    {
        public:
            string response(){return "Darling!";}
    };

    State *state;
    public:
        Creature(): state(new Frog()){}
        void greet()
        {
            cout<<state->response()<<endl;
        }
        void kiss()
        {
            delete state;
            state=new Prince();
        }
};


int main()
{
    Creature creature;
    creature.greet();
    creature.kiss();
    creature.greet();
}

posted @ 2011-04-28 16:04 周強 閱讀(738) | 評論 (0)編輯 收藏

c++設計模式( 二) 命令:選擇操作

      命令(command)模式的結構很簡單,但是對于消除代碼間的耦合,清理代碼去有著重要的影響。從最直觀的角度來看,命令模式就是一個函數對象:一個作為對象的函數。通過將函數封裝為對象,就能夠以參數的形式將其傳遞給其他函數或者對象,告訴它們在履行請求的過程中執行特定的操作。可以說,命令模式是攜帶行為信息的信使。一個簡單的例子如下:
#include<iostream>
#include<vector>

using namespace std;

class Command
{
    public:
        virtual void execute()=0;
};


class Hello: public Command
{
    public:
        void execute(){cout<<"hello ";}
};


class World : public Command
{
    public:
        void execute(){cout<<"world!";}
};

class IAm:public Command
{
    public:
        void execute(){cout<<"I'm the command pattern!";}
};

class Macro
{
    vector<Command *>commands;
    public:
        void add(Command *c){commands.push_back(c);}
        void run()
        {
            vector<Command*>::iterator it=commands.begin();
            while(it!=commands.end())
            {
                (*it++)->execute();
                cout<<endl;
            }
            
        }
};


int main()
{
    Macro macro;
    macro.add(new Hello);
    macro.add(new World);
    macro.add(new IAm);
    macro.run();
}

      命令模式的主要特點是允許向一個函數或者對象傳遞一個想要的動作。上述例子提供了將一系列需要一起執行的動作集進行排隊的方法。在這里,可以動態創建新的行為,某些事情通常只能通過編寫新的代碼來完成,而在上述例子中可以通過解釋一個腳本來實現。

參考:c++編程思想2

posted @ 2011-04-28 14:26 周強 閱讀(423) | 評論 (0)編輯 收藏

c++設計模式(一) 單件(Singleton)

設計模式或許是面向對象設計方法學前進過程中的最新,最重要的一步。設計模式當今已成為面向對象程序設計的重要部分。

單件也許是最簡單的設計模式,它是允許一個類有且僅有一個實例的方法。創建一個單件模式的關鍵是防止客戶程序員獲得任何控制其對象生存期的權利。為了做到這一點,聲明所有的構造函數為私有,并且防止編譯器隱式生成任何構造函數。注意,拷貝構造函數和賦值操作符(這兩個故意沒有實現,,因為它們根本不會被調用)被聲明為私有,以便防止任何這類復制動作產生。這種方法并沒有限制只創建一個對象。這種技術也支持創建有限個對象的對象池。

下面的程序顯示在c++中如何實現一個單件模式
#include<iostream>

using namespace std;


class Singleton
{
    static Singleton s;
    int i;
    Singleton(int x):i(x){}
    Singleton & operator=(Singleton &); //disallowed
    Singleton(const Singleton &);

public:
    static Singleton & instance(){return s;}
    int getValue(){return i;}
    void setValue(int x){i=x;}
};


Singleton Singleton::s(47);


int main()
{
    Singleton &s =Singleton::instance();
    cout<<s.getValue()<<endl;
    Singleton &s2=Singleton::instance();
    s2.setValue(9);
    cout<<s.getValue()<<endl;
}


參考:c++ 編程思想 2

posted @ 2011-04-28 10:41 周強 閱讀(454) | 評論 (0)編輯 收藏

Web Bench

今天開始要看nginx 源碼了,首先先看一個web服務器壓力測試工具Web Bench 。

Web Bench is very simple tool for benchmarking WWW or proxy servers. Uses fork() for simulating multiple clients and can use HTTP/0.9-HTTP/1.1 requests. This benchmark is not very realistic, but it can test if your HTTPD can realy handle that many clients at once (try to run some CGIs) without taking your machine down. Displays pages/min and bytes/sec. Can be used in more aggressive mode with -f switch.

Web Bench 下載主頁 http://home..cz/~cz210552/webbench.html


用Web Bench 簡單測試下nginx服務器的性能。結果如下
測試參數 10000個用戶并發請求30秒




posted @ 2011-04-26 14:50 周強 閱讀(281) | 評論 (0)編輯 收藏

僅列出標題
共6頁: 1 2 3 4 5 6 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国产精品久久久久久久久久| 亚洲国产高清自拍| 中日韩美女免费视频网址在线观看| 欧美韩日亚洲| 久久精品二区| 亚洲欧洲日产国码二区| 先锋影音久久久| 亚洲国产成人av好男人在线观看| 久久视频精品在线| 亚洲一区网站| 日韩午夜在线播放| 亚洲永久网站| 国产精品多人| 亚洲一区二区视频在线| 麻豆久久精品| 久久精品99久久香蕉国产色戒| 欧美吻胸吃奶大尺度电影| 亚洲人体偷拍| 亚洲经典视频在线观看| 免费一区视频| 夜夜嗨一区二区| 亚洲激情视频网站| 欧美激情区在线播放| 亚洲欧洲一区二区三区| 欧美一区二区在线免费观看| 亚洲精品国产精品国自产观看| 亚洲日本免费电影| 亚洲国产高清高潮精品美女| 91久久夜色精品国产网站| 亚洲一区二区免费视频| 一本在线高清不卡dvd| 午夜精品影院在线观看| 欧美激情小视频| 国产在线麻豆精品观看| 亚洲视频自拍偷拍| 欧美国产日韩一二三区| 午夜精品在线观看| 欧美日韩在线一区二区三区| 亚洲二区视频在线| 久久精品国产精品| 中国成人黄色视屏| 欧美激情国产高清| 在线观看日韩欧美| 久久久久一区二区三区四区| 夜夜精品视频一区二区| 欧美理论在线播放| 亚洲国产精品视频| 久久综合亚洲社区| 久久成人国产精品| 国产精品影视天天线| 亚洲天堂第二页| 亚洲精品乱码久久久久| 蜜桃精品久久久久久久免费影院| 经典三级久久| 久久亚洲精品一区二区| 欧美专区在线观看一区| 国产亚洲网站| 久久久一二三| 久久精品一区二区三区不卡牛牛| 国产精品看片资源| 午夜精品视频| 午夜视频久久久| 国产午夜精品一区二区三区视频| 日韩小视频在线观看专区| 免播放器亚洲| 亚洲欧美国产三级| 久久在线免费观看视频| 国产在线视频欧美一区二区三区| 欧美与黑人午夜性猛交久久久| 在线视频一区二区| 欧美性色视频在线| 欧美一级久久久| 欧美影院成人| 一色屋精品视频在线看| 欧美成年人网站| 欧美激情免费在线| 99在线观看免费视频精品观看| 亚洲国产精品一区二区尤物区| 免费观看日韩| 欧美专区在线观看| 亚洲国产精品成人| 欧美精品一区二区三区在线播放| 亚洲片国产一区一级在线观看| 亚洲国产精品毛片| 欧美日韩在线播放三区| 午夜视频久久久久久| 欧美一区二区三区视频免费| 亚洲第一级黄色片| 99re热精品| 国产专区欧美精品| 亚洲精品在线视频| 国产一区二区三区视频在线观看| 欧美成人黑人xx视频免费观看| 欧美精品 国产精品| 午夜精品999| 久久综合狠狠综合久久激情| 亚洲一级电影| 久久综合狠狠综合久久综青草 | 午夜精品福利电影| 亚洲一区二区在线免费观看视频| 国产伦精品一区二区三区高清| 久久久久久精| 欧美激情第9页| 欧美综合二区| 欧美日本亚洲韩国国产| 久久久久久9| 欧美丝袜第一区| 欧美成人激情视频| 国产婷婷精品| 一本色道久久综合亚洲精品高清| 一区二区在线免费观看| 亚洲丝袜av一区| 亚洲麻豆一区| 猫咪成人在线观看| 久久亚洲精品一区| 国产精品天天看| 91久久精品www人人做人人爽| 蜜桃av一区二区在线观看| 欧美日韩第一区日日骚| 欧美成人综合| 亚洲欧美日韩区| 欧美黄色片免费观看| 久久青草福利网站| 国产精品久久久久久久久搜平片| 欧美电影在线播放| 国产日韩欧美亚洲| 亚洲视频一区二区在线观看| 亚洲欧洲在线视频| 玖玖玖国产精品| 久久在线视频| 国产一区二区三区黄| 亚洲欧美日韩天堂一区二区| 亚洲自拍都市欧美小说| 欧美日本精品一区二区三区| 亚洲电影在线播放| 亚洲国产精品久久久| 久久天天狠狠| 亚洲精品美女在线观看播放| 久久精品中文字幕一区二区三区| 欧美韩日一区| 红桃av永久久久| 欧美一区午夜视频在线观看| 西西裸体人体做爰大胆久久久| 欧美视频一二三区| 99视频精品在线| 亚洲欧美日韩国产中文| 国产精品入口福利| 亚洲摸下面视频| 欧美中文字幕在线观看| 国产亚洲福利| 久久精品一区二区三区不卡牛牛 | 久久人人97超碰国产公开结果| 国产精品网红福利| 先锋资源久久| 在线视频欧美日韩| 一区二区三区福利| 欧美在线一二三| 香蕉久久一区二区不卡无毒影院| 亚洲风情亚aⅴ在线发布| 亚洲电影天堂av| 美脚丝袜一区二区三区在线观看| 亚洲大片在线| 亚洲一级电影| 国外成人网址| 欧美福利小视频| 国产精品99久久不卡二区| 欧美一区二区在线免费观看| 国产综合视频在线观看| 免费日韩成人| 亚洲天堂男人| 欧美99在线视频观看| 亚洲性图久久| 亚洲高清不卡| 国产精品福利在线观看| 亚洲一区精品在线| 一区二区三区国产在线| 黄色日韩网站视频| 亚洲性图久久| 亚洲欧美资源在线| 欧美国产在线电影| 先锋影院在线亚洲| 免费成人网www| 欧美午夜视频网站| 韩国在线视频一区| 亚洲国产欧美日韩精品| 亚洲一区二区三区在线看| 一区二区三区在线看| 欧美日韩激情网| 久久字幕精品一区| 欧美亚洲免费电影| 亚洲最新合集| 亚洲国产裸拍裸体视频在线观看乱了中文 | 在线精品一区二区| 久久精品女人| 日韩视频一区二区| 欧美电影免费网站| 久久精品人人爽| 亚洲在线观看视频| 亚洲免费观看高清完整版在线观看熊 | 亚洲春色另类小说|