<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    合工大很牛很牛牛

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      14 Posts :: 1 Stories :: 37 Comments :: 0 Trackbacks
     一個(gè)糖果機(jī),有四個(gè)狀態(tài),狀態(tài)圖如下:

    最基本的實(shí)現(xiàn)思路如下:用四個(gè)整型數(shù)表示四種狀態(tài),用四個(gè)函數(shù)表達(dá)四個(gè)操作,每次進(jìn)行操作的時(shí)候都要判斷一下是否處于可進(jìn)行這步操作的狀態(tài),操作完成后,需要更新狀態(tài)到下一步。

    package javaapplication41;

    public class Main {

        public static void main(String[] args) {

            GumballMachine gm = new GumballMachine();

            gm.addGumballsToMachine(2);

            gm.insertQuarter();

            gm.turnsCrank();

            System.out.println("------------------");

            gm.insertQuarter();

            gm.insertQuarter();

            gm.turnsCrank();

            gm.ejectQuarter();

            gm.turnsCrank();

        }

    }

    class GumballMachine {

        final int SOLD_OUT = 0;

        final int NO_QUARTER = 1;

        final int HAS_QUARTER = 2;

        final int SOLD = 3;

        int state;

        int gumballs = 0;

        public GumballMachine() {

            state = SOLD_OUT;

        }

        public void insertQuarter() {

            if (state == NO_QUARTER) {

                System.out.println("inserting the quarter");

                state = HAS_QUARTER;

            }

            else if (state == HAS_QUARTER) {

                System.out.println("already has the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

        }

        public void ejectQuarter() {

            if (state == HAS_QUARTER) {

                System.out.println("ejecting the quarter....");

                state = NO_QUARTER;

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

        }

        public void turnsCrank() {

            if (state == HAS_QUARTER) {

                System.out.println("turning on the crank");

                state = SOLD;

                dispense();           

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

        }

        private void dispense() {

            if (state == SOLD) {

                if (gumballs == 0) {

                    System.out.println("out of gumballs");

                    state = SOLD_OUT;

                }

                else {

                    System.out.println("dispensing the gumball");

                    gumballs--;

                    System.out.println("there are " + gumballs + " gumballs in the machine.");

                    state = NO_QUARTER;

                }

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == HAS_QUARTER) {

                System.out.println("you haven't turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

        }

        public void addGumballsToMachine(int num) {

            gumballs += num;

            System.out.println("adding " + num + " gumballs to the machine.");

            System.out.println("there are " + gumballs + " gumballs in the machine.");

            System.out.println("--------------------");

            if (gumballs > 0) {

                state = NO_QUARTER;

            }

        }

    }

    現(xiàn)在添加一個(gè)新的流程:當(dāng)turns crank的時(shí)候,判斷是否為1/10概率產(chǎn)生的幸運(yùn)兒,如果是,則彈出兩個(gè)糖果,如果不是,則仍彈出一個(gè)糖果。


    實(shí)現(xiàn)如下:

    package javaapplication41;

    public class Main {

        public static void main(String[] args) {

            GumballMachine gm = new GumballMachine();

            gm.addGumballsToMachine(2);

            gm.insertQuarter();

            gm.turnsCrank();

            System.out.println("------------------");

            gm.insertQuarter();

            gm.insertQuarter();

            gm.turnsCrank();

            gm.ejectQuarter();

            gm.turnsCrank();

        }

    }

    class GumballMachine {

        final int SOLD_OUT = 0;

        final int NO_QUARTER = 1;

        final int HAS_QUARTER = 2;

        final int SOLD = 3;

        final int SOLD_TO_WINNER = 4;

        int state;

        int gumballs = 0;

        public GumballMachine() {

            state = SOLD_OUT;

        }

        public void insertQuarter() {

            if (state == NO_QUARTER) {

                System.out.println("inserting the quarter");

                state = HAS_QUARTER;

            }

            else if (state == HAS_QUARTER) {

                System.out.println("already has the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

            else if (state == SOLD_TO_WINNER) {

                System.out.println("already has the quarter and have turn the crank");

            }

        }

        public void ejectQuarter() {

            if (state == HAS_QUARTER) {

                System.out.println("ejecting the quarter....");

                state = NO_QUARTER;

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

            else if (state == SOLD_TO_WINNER) {

                System.out.println("already has the quarter and have turn the crank");

            }

        }

        public void turnsCrank() {

            if (state == HAS_QUARTER) {

                System.out.println("turning on the crank");

                state = SOLD;

                dispense();

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == SOLD) {

                System.out.println("already has the quarter and have turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

            else if (state == SOLD_TO_WINNER) {

                System.out.println("already has the quarter and have turn the crank");

            }

        }

        private void dispense() {

            if (state == SOLD) {

                if (gumballs == 0) {

                    System.out.println("out of gumballs");

                    state = SOLD_OUT;

                }

                else {

                    System.out.println("dispensing the gumball");

                    gumballs--;

                    System.out.println("there are " + gumballs + " gumballs in the machine.");

                    state = NO_QUARTER;

                }

            }

            else if (state == SOLD_TO_WINNER) {

                if (gumballs == 0) {

                    System.out.println("out of gumballs");

                    state = SOLD_OUT;

                }

                else if (gumballs == 1) {

                    System.out.println("dispensing the gumball");

                    gumballs--;

                    System.out.println("there are " + gumballs + " gumballs in the machine.");

                    state = SOLD_OUT;

                }

                else if (gumballs > 1) {

                    System.out.println("dispensing the 2 gumballs");

                    gumballs -= 2;

                    System.out.println("there are " + gumballs + " gumballs in the machine.");

                    state = NO_QUARTER;

                }

            }

            else if (state == NO_QUARTER) {

                System.out.println("you haven't insert the quarter");

            }

            else if (state == HAS_QUARTER) {

                System.out.println("you haven't turn the crank");

            }

            else if (state == SOLD_OUT) {

                System.out.println("there is no gumballs in the machine");

            }

        }

        public void addGumballsToMachine(int num) {

            gumballs += num;

            System.out.println("adding " + num + " gumballs to the machine.");

            System.out.println("there are " + gumballs + " gumballs in the machine.");

            System.out.println("--------------------");

            if (gumballs > 0) {

                state = NO_QUARTER;

            }

        }

    }

    可見,為了添加一個(gè)流程,我們首先需要添加一個(gè)狀態(tài)SOLD_TO_WINNER = 4,然后在每個(gè)流程里面都要判斷一下是否處于這個(gè)狀態(tài),故而每個(gè)流程都添加了一個(gè)else if….

    這樣的代碼,維護(hù)起來是可怕的,也就是說,這樣的設(shè)計(jì)思路是不易于擴(kuò)展的。

    看到上面的程序,讓我想到了以前寫的“郵件收發(fā)程序”,繁復(fù)的else if…判斷語句讓我修改到最后,實(shí)在連看都不想看!不過好了,現(xiàn)在有了state pattern,專門處理怎樣寫業(yè)務(wù)流程。

    State Pattern 的前提條件是:經(jīng)常發(fā)生改變的是狀態(tài)(也就是業(yè)務(wù)流程),而不是“操作”。在上面的例子中,我們把四個(gè)“操作”寫成了類,但發(fā)生變化的不是操作,而是if…else中的狀態(tài)。所以反其道而行之,我們把各個(gè)狀態(tài)寫成類(把易變化的隔離的單獨(dú)的類里面去)。如下:(未增加新狀態(tài)前)

    package javaapplication42;

    public class Main {

        public static void main(String[] args) {

            GumballMachine gm = new GumballMachine();

            gm.addGumballs(2);

            gm.state.insertQuarter();//并沒有指明是哪種狀態(tài),全部都用state,這就是代理

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.ejectQuarter();

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.insertQuarter();

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.turnCrank();

            gm.addGumballs(1);

            gm.state.insertQuarter();

            gm.state.turnCrank();

        }

    }

    interface State { //四個(gè)狀態(tài)都繼承它,這樣我們可以“代理”,每個(gè)狀態(tài)都有如下四個(gè)操作。

        public void insertQuarter();

        public void ejectQuarter();

        public void turnCrank();

        public void dispense();

    }

    class GumballMachine {

        State state;

        State noQuarterState;

        State hasQuarterState;

        State soldState;

        State soldOutState;

        int gumballNum;//機(jī)器內(nèi)糖果的數(shù)量

        public GumballMachine() {

            noQuarterState = new NoQuarterState(this);

            hasQuarterState = new HasQuarterState(this);

            soldState = new SoldState(this);

            soldOutState = new SoldOutState(this);

            this.state = soldOutState;//initialize "state",這個(gè)state將貫穿整個(gè)執(zhí)行過程

            gumballNum = 0;

        }

        public void setState(State state) {

            this.state = state;

        }

        public void play() {

            state.insertQuarter();

            state.turnCrank();

            state.dispense();

        }

        public void addGumballs(int num) {

            gumballNum += num;

            if (gumballNum > 0) {

                this.state = noQuarterState;

            }

            System.out.println("the machine has "+gumballNum+" gumball(s)");

        }

    }

    class NoQuarterState implements State {

        GumballMachine gm;

        public NoQuarterState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

           System.out.println("insert a quarter...");

            gm.setState(gm.hasQuarterState);//執(zhí)行完后,改變狀態(tài)

        }

        public void ejectQuarter() {

            System.out.println("you can't eject quarter, for you haven't insert yet 1");

        }

        public void turnCrank() {

            System.out.println("you can't turn crank, for you haven't insert yet 2");

        }

        public void dispense() {

            System.out.println("you can't dispense, for you haven't insert yet 3");

        }

    }

    class HasQuarterState implements State {

        GumballMachine gm;

        public HasQuarterState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            System.out.println("you can't insert quarter, for you have insert one already");

        }

        public void ejectQuarter() {

            System.out.println("eject quarter...");

            gm.setState(gm.noQuarterState);

        }

        public void turnCrank() {

            System.out.println("turning the crank...");

            gm.setState(gm.soldState);

            gm.state.dispense();

        }

        public void dispense() {

            System.out.println("when you turn the crank, the machine will dispense the gumball");

        }

    }

    class SoldState implements State {

        GumballMachine gm;

        public SoldState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void ejectQuarter() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void turnCrank() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void dispense() {

            gm.gumballNum--;

            System.out.println("dispense one gumball...");

            if (gm.gumballNum > 0) {

                gm.setState(gm.noQuarterState);

            }

            else {

                System.out.println("Machine has no gumball");

                gm.setState(gm.soldOutState);

            }

        }

    }

    class SoldOutState implements State {

        GumballMachine gm;

        public SoldOutState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            System.out.println("you can't insert quarter, for the machine has no gumball");

        }

        public void ejectQuarter() {

            System.out.println("you can't eject quarter, for the machine has no gumball");

        }

        public void turnCrank() {

            System.out.println("you can't turn crank, for the machine has no gumball");

        }

        public void dispense() {

            System.out.println("you can't dispense, for the machine has no gumball");

        }

    }


    現(xiàn)在,我們新增
    SoldToWinnerState流程(1/10的概率獲得兩個(gè)gumball):

    package javaapplication42;

    import java.util.Random;

    public class Main {

        public static void main(String[] args) {

            GumballMachine gm = new GumballMachine();

            gm.addGumballs(2);

            gm.state.insertQuarter();

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.ejectQuarter();

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.insertQuarter();

            gm.state.turnCrank();

            gm.state.insertQuarter();

            gm.state.turnCrank();

            gm.addGumballs(1);

            gm.state.insertQuarter();

            gm.state.turnCrank();

        }

    }

    interface State {

        public void insertQuarter();

        public void ejectQuarter();

        public void turnCrank();

        public void dispense();

    }

    class GumballMachine {

        State state;

        State noQuarterState;

        State hasQuarterState;

        State soldState;

        State soldOutState;

        State soldToWinnerState;

        int gumballNum;//機(jī)器內(nèi)糖果的數(shù)量

        public GumballMachine() {

            noQuarterState = new NoQuarterState(this);

            hasQuarterState = new HasQuarterState(this);

            soldState = new SoldState(this);

            soldOutState = new SoldOutState(this);

            soldToWinnerState = new SoldToWinnerState(this);

            this.state = soldOutState;//initialize "state",這個(gè)state將貫穿整個(gè)執(zhí)行過程

            gumballNum = 0;

        }

        public void setState(State state) {

            this.state = state;

        }

        public void play() {

            state.insertQuarter();

            state.turnCrank();

            state.dispense();

        }

        public void addGumballs(int num) {

            gumballNum += num;

            if (gumballNum > 0) {

                this.state = noQuarterState;

            }

            System.out.println("the machine has " + gumballNum + " gumball(s)");

        }

    }

    class SoldToWinnerState implements State {

        GumballMachine gm;

        public SoldToWinnerState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            System.out.println("you have insert one quarter already");

        }

        public void ejectQuarter() {

            System.out.println("you have turn crank already");

        }

        public void turnCrank() {

            System.out.println("you have turn crank already");

        }

        public void dispense() {

            gm.gumballNum -= 2; //具體細(xì)節(jié),比如機(jī)器里只有一個(gè)糖果,暫不考慮,不是重點(diǎn)

            System.out.println("*************you are winner!************");

            System.out.println("dispense two gumball...");

            if (gm.gumballNum > 0) {

                gm.setState(gm.noQuarterState);

            }

            else {

                System.out.println("Machine has no gumball");

                gm.setState(gm.soldOutState);

           }

        }

    }

    class NoQuarterState implements State {

        GumballMachine gm;

        public NoQuarterState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            System.out.println("insert a quarter...");

            gm.setState(gm.hasQuarterState);

        }

        public void ejectQuarter() {

            System.out.println("you can't eject quarter, for you haven't insert yet 1");

        }

        public void turnCrank() {

            System.out.println("you can't turn crank, for you haven't insert yet 2");

        }

        public void dispense() {

            System.out.println("you can't dispense, for you haven't insert yet 3");

        }

    }

    class HasQuarterState implements State {

        Random rm;

        GumballMachine gm;

        public HasQuarterState(GumballMachine gm) {

            this.gm = gm;

            rm = new Random();

        }

        public void insertQuarter() {

            System.out.println("you can't insert quarter, for you have insert one already");

        }

        public void ejectQuarter() {

            System.out.println("eject quarter...");

            gm.setState(gm.noQuarterState);

        }

        public void turnCrank() {

            System.out.println("turning the crank...");

            if (rm.nextFloat() * 10 == 9) { //產(chǎn)生0-9之間的隨機(jī)數(shù)

                gm.setState(gm.soldToWinnerState);

            }

            else {

                gm.setState(gm.soldState);

            }

            gm.state.dispense();

        }

        public void dispense() {

            System.out.println("when you turn the crank, the machine will dispense the gumball");

        }

    }

    class SoldState implements State {

        GumballMachine gm;

        public SoldState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void ejectQuarter() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void turnCrank() {

            throw new UnsupportedOperationException("Not supported yet.");

        }

        public void dispense() {

            gm.gumballNum--;

            System.out.println("dispense one gumball...");

            if (gm.gumballNum > 0) {

                gm.setState(gm.noQuarterState);

            }

            else {

                System.out.println("Machine has no gumball");

                gm.setState(gm.soldOutState);

            }

        }

    }

    class SoldOutState implements State {

        GumballMachine gm;

        public SoldOutState(GumballMachine gm) {

            this.gm = gm;

        }

        public void insertQuarter() {

            System.out.println("you can't insert quarter, for the machine has no gumball");

        }

        public void ejectQuarter() {

            System.out.println("you can't eject quarter, for the machine has no gumball");

        }

        public void turnCrank() {

            System.out.println("you can't turn crank, for the machine has no gumball");

        }

        public void dispense() {

            System.out.println("you can't dispense, for the machine has no gumball");

        }

    }


    可見,在
    state pattern中,新增一個(gè)狀態(tài),只需要新增一個(gè)(表達(dá)這個(gè)狀態(tài)的)類,并在該狀態(tài)的“上游狀態(tài)”做少許改動(dòng)即可。

    posted on 2008-07-18 00:38 化的了 閱讀(2861) 評(píng)論(8)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

    Feedback

    # re: State Pattern 狀態(tài)模式 2008-07-18 08:45 melland
    都是head first design pattern上的例子呀  回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式 2008-07-18 09:13 Always BaNg.
    我不知道寫這種非自己原創(chuàng),并且資料隨處可查的東西有什么意義?

    或許你寫State Pattern但可以加入自己在實(shí)際工程使用過程中的體會(huì)啊。

    純碎的抄襲是可恥的,不指明原處的抄襲更加可恥!


    沒有攻擊樓主的意思,是不過對(duì)于一個(gè)嚴(yán)格要求自己的程序員來說,應(yīng)該做的更好一些。  回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式 2008-07-18 13:40 ron
    如果狀態(tài)變化不頻繁,沒有必要使用這種方式。代碼膨脹,可讀性極差!我喜歡使用表驅(qū)動(dòng)。將狀態(tài)和變換方式存儲(chǔ)為表的橫格和豎格,將狀態(tài)處理函數(shù)指針存儲(chǔ)為表格的內(nèi)容。如果想擴(kuò)展,增加行或者列即可。
    ----------------
    老實(shí)說,你文中給的那個(gè)例子太啰嗦了。  回復(fù)  更多評(píng)論
      

    @Always BaNg.
    書的確是看的《Head first desgin pattern》
    舉的例子也的確是書上的。

    但代碼是自己寫的,文字思路是自己的,UML圖是自己畫的。。。不存在抄襲的問題。只是想自己總結(jié)一下這些設(shè)計(jì)模式的思路的產(chǎn)生過程。

    本人還是學(xué)生,看書學(xué)習(xí)為主,項(xiàng)目經(jīng)驗(yàn)幾乎沒有,寫的不好,希望大家理解。有的東西,其實(shí)是寫給自己看的,放在網(wǎng)上,大家覺得好,也可以分享。覺得不好,就算了。  回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式 2008-07-18 15:52 Always BaNg.
    @化的了
    不好意思,如果是學(xué)生,我說的有些過分,先表示歉意。

    不過現(xiàn)在學(xué)校一般教的都很爛,你更應(yīng)該把時(shí)間花在比如數(shù)學(xué),操作系統(tǒng),計(jì)算機(jī)原理,編譯原理,硬件相關(guān)的編程上面,設(shè)計(jì)模式的本意是在有很大量設(shè)計(jì)之后才產(chǎn)生的模式,即細(xì)節(jié)已不是什么大問題,全局是問題。如果計(jì)算機(jī)基礎(chǔ)都不牢固,空談這些模式?jīng)]什么意義,先把細(xì)節(jié)搞清楚才是王道。

    再者,多參與一些項(xiàng)目實(shí)踐,對(duì)自己很有好處。

    最后,祝博主學(xué)業(yè)有成!


      回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式 2008-07-22 14:13 Bruce Luo
    switch(month){
    case 1,3,5,7,8,10,12:
    day=31;break;
    case 4,6,9,11:
    day=30;break;
    case 2:
    day=28;break;
    }
    使用表驅(qū)動(dòng)法:
    var days=new Array(31,28,31,30,31,30,31,31,30,31,30,31);
    day=days[month-1];
      回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式[未登錄] 2008-12-03 14:46 aa
    這樣的爛東西不要放上來,浪費(fèi)大家的時(shí)間  回復(fù)  更多評(píng)論
      

    # re: State Pattern 狀態(tài)模式 2009-03-17 16:13 zdcin
    @ron
    我深有同感,表驅(qū)動(dòng)的狀態(tài)模式比這種代碼簡潔多了(只有架構(gòu)代碼,數(shù)據(jù)全在表中),而且更能抽象狀態(tài)的變化流轉(zhuǎn),更具有通用性,類實(shí)現(xiàn)的狀態(tài)機(jī),架構(gòu)代碼也應(yīng)用代碼混淆,而且應(yīng)用代碼重復(fù)(狀態(tài)有多少個(gè)就重復(fù)多少次),在應(yīng)用代碼中可以任意跳轉(zhuǎn),看代碼都能把人看暈,實(shí)在不知道GOF講設(shè)計(jì)模式時(shí)為什么不多講講類方式狀態(tài)機(jī)的弊端,以至造成類方式狀態(tài)機(jī)的泛濫。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 亚洲人成电影在线天堂| 成人免费看黄20分钟| 免费h视频在线观看| a毛片在线看片免费| 中文字幕免费在线看线人动作大片| 一级一级一级毛片免费毛片| 久久免费观看视频| 男女拍拍拍免费视频网站| 在线观看免费视频网站色| 国内永久免费crm系统z在线| 精品在线免费观看| 8x成人永久免费视频| 亚洲精品免费网站| 成人免费网站在线观看| 九月婷婷亚洲综合在线| 中文亚洲成a人片在线观看| 亚洲伊人色欲综合网| 午夜影视日本亚洲欧洲精品一区| 久久综合亚洲色HEZYO社区| 麻豆狠色伊人亚洲综合网站| 亚洲精品伦理熟女国产一区二区| 久久亚洲AV成人无码国产最大| 男人和女人高潮免费网站| 中文字幕看片在线a免费| 99精品热线在线观看免费视频 | 亚洲国产综合91精品麻豆| 亚洲欧洲国产精品久久| 亚洲色大成网站www永久网站| 美女免费视频一区二区| a在线观看免费网址大全| 8x8×在线永久免费视频| 在线中文高清资源免费观看| 免费中文字幕一级毛片| 亚洲成亚洲乱码一二三四区软件| 亚洲人成网站18禁止久久影院 | 无码一区二区三区亚洲人妻 | 亚洲国产成a人v在线观看| 美女扒开屁股让男人桶爽免费| 怡红院免费的全部视频| 国内精品免费麻豆网站91麻豆| 日韩一区二区在线免费观看 |