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

哭了!為什么沒早用 Spring 狀態(tài)機?現(xiàn)在代碼優(yōu)雅到發(fā)光

開發(fā) 前端
Spring 狀態(tài)機還有很多高級特性和應用場景等待我們?nèi)ヌ剿?,比如工作流引擎、有限狀態(tài)自動機等。只要我們合理運用,它就能成為我們開發(fā)過程中的得力助手,讓我們的代碼質(zhì)量更上一層樓。

兄弟們,有沒有那么一瞬間,看著自己寫的那些處理狀態(tài)邏輯的代碼,恨不得給自己來兩拳?明明需求看起來挺簡單,就是處理個狀態(tài)轉(zhuǎn)換,結(jié)果寫著寫著,代碼里全是各種 if-else 或者 switch,層層嵌套,跟迷宮似的。不僅自己看著頭疼,同事接手的時候,估計心里也在默默問候咱的祖宗十八代。而且最要命的是,稍微不注意,狀態(tài)判斷錯了,bug 就跟雨后春筍似的冒出來,debug 都能讓人 debug 到懷疑人生。

咱就拿一個常見的訂單業(yè)務來說吧。訂單有創(chuàng)建、支付、發(fā)貨、收貨、取消、退款等等狀態(tài)。一開始,咱可能想著,這不簡單嘛,用 if-else 來判斷當前狀態(tài),然后根據(jù)不同的事件,比如用戶支付、商家發(fā)貨等,來更新訂單狀態(tài)。于是代碼里就出現(xiàn)了這樣的場景:

if (order.getStatus() == OrderStatus.CREATED) {
    if (event == Event.PAY) {
        // 處理支付邏輯
        order.setStatus(OrderStatus.PAID);
    } else if (event == Event.CANCEL) {
        // 處理取消邏輯
        order.setStatus(OrderStatus.CANCELED);
    }
} else if (order.getStatus() == OrderStatus.PAID) {
    if (event == Event.SHIP) {
        // 處理發(fā)貨邏輯
        order.setStatus(OrderStatus.SHIPPED);
    } else if (event == Event.REFUND) {
        // 處理退款邏輯
        order.setStatus(OrderStatus.REFUNDED);
    }
}
// 后面還有一堆類似的判斷...

隨著業(yè)務的不斷擴展,狀態(tài)越來越多,事件也越來越復雜,這樣的代碼簡直就是一場災難。維護起來難不說,要是新增一個狀態(tài)或者修改一個狀態(tài)轉(zhuǎn)換規(guī)則,那得把整個代碼翻個底朝天,還生怕漏掉某個地方,導致出現(xiàn)奇怪的 bug。這時候,咱心里是不是在想,有沒有一種更優(yōu)雅的方式來處理狀態(tài)邏輯呢?別急,今天咱就來聊聊 Spring 狀態(tài)機,用了它,保準讓你的代碼優(yōu)雅到發(fā)光,再也不用為狀態(tài)邏輯處理而發(fā)愁。

一、啥是狀態(tài)機?先把概念搞明白

在說 Spring 狀態(tài)機之前,咱得先弄清楚啥是狀態(tài)機。其實狀態(tài)機這玩意兒,在咱們?nèi)粘I钪须S處可見。比如說自動售貨機,它有不同的狀態(tài),比如等待投幣、等待選擇商品、出貨、找零等。當我們投入硬幣(這就是一個事件),自動售貨機就會從等待投幣狀態(tài)轉(zhuǎn)換到等待選擇商品狀態(tài);當我們選擇了一個商品(又是一個事件),它就會根據(jù)商品價格和我們投入的硬幣金額進行判斷,如果金額足夠,就會轉(zhuǎn)換到出貨狀態(tài),同時可能還會找零。

再比如說電梯,它有停止、運行、開門、關(guān)門等狀態(tài)。當我們在某一層按了電梯按鈕(事件),電梯如果在運行狀態(tài),可能會繼續(xù)運行到目標樓層,然后停止并開門;如果電梯在停止狀態(tài),就會開門讓我們進去,然后關(guān)門運行到我們選擇的樓層。

從計算機科學的角度來說,狀態(tài)機(State Machine)是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學模型。簡單來說,它由狀態(tài)(State)、事件(Event)、轉(zhuǎn)換(Transition)、動作(Action)和守衛(wèi)條件(Guard)組成。

  • 狀態(tài)(State):對象在其生命周期中的一種條件,比如訂單的創(chuàng)建狀態(tài)、支付狀態(tài)等。
  • 事件(Event):觸發(fā)狀態(tài)轉(zhuǎn)換的消息,比如用戶支付訂單、商家發(fā)貨等。
  • 轉(zhuǎn)換(Transition):從一個狀態(tài)到另一個狀態(tài)的遷移,通常由事件觸發(fā),并且可能需要滿足一定的守衛(wèi)條件。
  • 動作(Action):在狀態(tài)轉(zhuǎn)換過程中執(zhí)行的操作,比如更新訂單狀態(tài)、發(fā)送通知等。
  • 守衛(wèi)條件(Guard):一個布爾表達式,用于判斷事件是否能夠觸發(fā)狀態(tài)轉(zhuǎn)換,比如只有當訂單金額大于 0 時,才能進行支付操作。

狀態(tài)機的好處可太多了。它能讓我們清晰地描述對象的狀態(tài)變化過程,代碼結(jié)構(gòu)更加清晰,易于維護和擴展。而且,它能夠有效地避免狀態(tài)判斷的遺漏和錯誤,提高代碼的健壯性。

二、Spring 狀態(tài)機:Java 開發(fā)者的狀態(tài)管理神器

Spring 狀態(tài)機是 Spring 框架提供的一個用于構(gòu)建狀態(tài)機的模塊,它基于狀態(tài)模式和責任鏈模式,能夠方便地在 Java 應用中實現(xiàn)狀態(tài)機。Spring 狀態(tài)機支持多種狀態(tài)機模型,包括 UML 狀態(tài)機和簡單狀態(tài)機,我們可以根據(jù)具體的業(yè)務需求選擇合適的模型。

(一)Spring 狀態(tài)機的核心概念

狀態(tài)(State)

在 Spring 狀態(tài)機中,狀態(tài)可以分為簡單狀態(tài)和復合狀態(tài)。簡單狀態(tài)就是一個獨立的狀態(tài),比如訂單的創(chuàng)建狀態(tài);復合狀態(tài)可以包含子狀態(tài),比如訂單的處理中狀態(tài)可以包含支付中、發(fā)貨中等子狀態(tài)。我們可以通過枚舉類型來定義狀態(tài),例如:

public enum OrderState {
    CREATED, PAID, SHIPPED, DELIVERED, CANCELED, REFUNDED
}

事件(Event)

事件是觸發(fā)狀態(tài)轉(zhuǎn)換的原因,同樣可以用枚舉類型來定義,例如:

public enum OrderEvent {
    PAY, SHIP, DELIVER, CANCEL, REFUND
}

轉(zhuǎn)換(Transition)

轉(zhuǎn)換定義了從源狀態(tài)到目標狀態(tài)的映射,以及觸發(fā)轉(zhuǎn)換的事件和可能的守衛(wèi)條件、動作。在 Spring 狀態(tài)機中,我們可以通過配置來定義轉(zhuǎn)換規(guī)則。

動作(Action)

動作可以在狀態(tài)轉(zhuǎn)換的不同階段執(zhí)行,比如在事件觸發(fā)時、狀態(tài)轉(zhuǎn)換前、狀態(tài)轉(zhuǎn)換后等。我們可以自定義動作類,實現(xiàn) Action 接口,然后在配置中指定動作的執(zhí)行時機。

守衛(wèi)條件(Guard)

守衛(wèi)條件用于判斷事件是否能夠觸發(fā)狀態(tài)轉(zhuǎn)換,它是一個實現(xiàn)了 Guard 接口的類,返回一個布爾值。例如,只有當訂單未被取消時,才能進行發(fā)貨操作。

(二)Spring 狀態(tài)機的優(yōu)勢

代碼結(jié)構(gòu)清晰

使用 Spring 狀態(tài)機,我們可以將狀態(tài)邏輯從業(yè)務代碼中分離出來,通過配置的方式定義狀態(tài)轉(zhuǎn)換規(guī)則,使得代碼更加簡潔明了,易于理解和維護。

易于擴展

當業(yè)務需求發(fā)生變化,需要新增狀態(tài)或修改狀態(tài)轉(zhuǎn)換規(guī)則時,只需修改狀態(tài)機的配置,而無需修改大量的業(yè)務代碼,降低了代碼的修改成本。

支持復雜狀態(tài)邏輯

Spring 狀態(tài)機支持復合狀態(tài)、子狀態(tài)機等高級特性,能夠處理復雜的業(yè)務狀態(tài)邏輯,比如工作流、有限狀態(tài)自動機等。

與 Spring 生態(tài)集成良好

作為 Spring 框架的一部分,Spring 狀態(tài)機可以無縫集成 Spring 的其他模塊,比如 Spring Boot、Spring Data 等,方便我們構(gòu)建完整的應用系統(tǒng)。

三、手把手教你用 Spring 狀態(tài)機玩轉(zhuǎn)訂單狀態(tài)管理

接下來,咱就以訂單狀態(tài)管理為例,一步步教你如何使用 Spring 狀態(tài)機來實現(xiàn)優(yōu)雅的狀態(tài)邏輯處理。

(一)引入依賴

首先,我們需要在項目中引入 Spring 狀態(tài)機的依賴。如果使用 Spring Boot,只需在 pom.xml 中添加以下依賴:

<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-core</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.statemachine</groupId>
    <artifactId>spring-statemachine-config</artifactId>
</dependency>

(二)定義狀態(tài)和事件

我們已經(jīng)在前面定義了訂單的狀態(tài)枚舉 OrderState 和事件枚舉 OrderEvent,這里就不再重復了。

(三)配置狀態(tài)機

Spring 狀態(tài)機的配置可以通過 Java 配置類來實現(xiàn),我們需要創(chuàng)建一個配置類,繼承 StateMachineConfigurerAdapter,并覆蓋相關(guān)的方法來定義狀態(tài)機的狀態(tài)、轉(zhuǎn)換、動作和守衛(wèi)條件等。

@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderEvent> {
    // 定義狀態(tài)
    @Override
    public void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {
        states
           .withStates()
               .initial(OrderState.CREATED) // 初始狀態(tài)
               .states(EnumSet.allOf(OrderState.class));
    }
    // 定義轉(zhuǎn)換
    @Override
    public void configure(StateMachineTransitionConfigurer<OrderState, OrderEvent> transitions) throws Exception {
        transitions
           .withExternal() // 外部轉(zhuǎn)換,會改變狀態(tài)
               .source(OrderState.CREATED) // 源狀態(tài)
               .target(OrderState.PAID) // 目標狀態(tài)
               .event(OrderEvent.PAY) // 觸發(fā)事件
               .action(payAction()) // 執(zhí)行的動作
               .guard(payGuard()) // 守衛(wèi)條件
           .and()
           .withExternal()
               .source(OrderState.PAID)
               .target(OrderState.SHIPPED)
               .event(OrderEvent.SHIP)
               .action(shipAction())
           .and()
           .withExternal()
               .source(OrderState.SHIPPED)
               .target(OrderState.DELIVERED)
               .event(OrderEvent.DELIVER)
               .action(deliverAction())
           .and()
           .withExternal()
               .source(OrderState.CREATED)
               .target(OrderState.CANCELED)
               .event(OrderEvent.CANCEL)
               .action(cancelAction())
           .and()
           .withExternal()
               .source(OrderState.PAID)
               .target(OrderState.REFUNDED)
               .event(OrderEvent.REFUND)
               .action(refundAction());
    }
    // 定義動作
    @Bean
    public Action<OrderState, OrderEvent> payAction() {
        return new Action<OrderState, OrderEvent>() {
            @Override
            public void execute(StateContext<OrderState, OrderEvent> context) {
                // 處理支付動作,比如更新訂單支付時間、調(diào)用支付接口等
                System.out.println("執(zhí)行支付動作");
                Order order = context.getMessage().getHeaders().get("order", Order.class);
                order.setStatus(OrderState.PAID);
                order.setPaymentTime(new Date());
                // 這里可以添加具體的業(yè)務邏輯
            }
        };
    }
    @Bean
    public Action<OrderState, OrderEvent> shipAction() {
        return context -> {
            // 處理發(fā)貨動作,比如生成物流單號、更新發(fā)貨時間等
            System.out.println("執(zhí)行發(fā)貨動作");
            Order order = context.getMessage().getHeaders().get("order", Order.class);
            order.setStatus(OrderState.SHIPPED);
            order.setShipTime(new Date());
            // 這里可以添加具體的業(yè)務邏輯
        };
    }
    // 定義守衛(wèi)條件
    @Bean
    public Guard<OrderState, OrderEvent> payGuard() {
        return context -> {
            // 判斷訂單金額是否大于 0,只有金額大于 0 才能支付
            Order order = context.getMessage().getHeaders().get("order", Order.class);
            return order.getAmount() > 0;
        };
    }
}

在上面的配置中,我們首先定義了狀態(tài),指定了初始狀態(tài)為 CREATED,并包含了所有的訂單狀態(tài)。然后定義了轉(zhuǎn)換規(guī)則,每個轉(zhuǎn)換都指定了源狀態(tài)、目標狀態(tài)、觸發(fā)事件、動作和守衛(wèi)條件(可選)。動作和守衛(wèi)條件通過 Bean 的方式定義,方便重用和測試。

(四)使用狀態(tài)機

配置好狀態(tài)機之后,我們就可以在業(yè)務代碼中使用它了。首先,需要注入 StateMachine 對象:

@Autowired
private StateMachine<OrderState, OrderEvent> orderStateMachine;

然后,在處理事件時,創(chuàng)建消息對象,并將訂單對象作為參數(shù)傳遞給狀態(tài)機:

public void processEvent(Order order, OrderEvent event) {
    // 創(chuàng)建消息,將訂單對象作為參數(shù)
    Message<OrderEvent> message = MessageBuilder.withPayload(event)
       .setHeader("order", order)
       .build();
    // 發(fā)送事件給狀態(tài)機
    orderStateMachine.sendEvent(message);
}

當狀態(tài)機接收到事件后,會根據(jù)配置的轉(zhuǎn)換規(guī)則進行狀態(tài)轉(zhuǎn)換,并執(zhí)行相應的動作和守衛(wèi)條件。

(五)狀態(tài)機監(jiān)聽器

為了更好地監(jiān)控狀態(tài)機的狀態(tài)變化,我們可以添加監(jiān)聽器,監(jiān)聽狀態(tài)的進入、退出和轉(zhuǎn)換等事件。例如:

@Configuration
public class OrderStateMachineListenerConfig {
    @Autowired
    public void configure(StateMachineFactory<OrderState, OrderEvent> factory) {
        factory.getStateMachine().addStateListener(new StateListener<OrderState, OrderEvent>() {
            @Override
            public void stateChanged(State<OrderState, OrderEvent> from, State<OrderState, OrderEvent> to) {
                // 狀態(tài)發(fā)生變化時觸發(fā)
                System.out.println("狀態(tài)從 " + from.getId() + " 轉(zhuǎn)換到 " + to.getId());
            }
        });
        factory.getStateMachine().addTransitionListener(new TransitionListener<OrderState, OrderEvent>() {
            @Override
            public void transitionStarted(Transition<OrderState, OrderEvent> transition) {
                // 轉(zhuǎn)換開始時觸發(fā)
                System.out.println("轉(zhuǎn)換開始:" + transition.getSource().getId() + " -> " + transition.getTarget().getId());
            }
            @Override
            public void transitionEnded(Transition<OrderState, OrderEvent> transition) {
                // 轉(zhuǎn)換結(jié)束時觸發(fā)
                System.out.println("轉(zhuǎn)換結(jié)束:" + transition.getSource().getId() + " -> " + transition.getTarget().getId());
            }
        });
    }
}

通過監(jiān)聽器,我們可以在狀態(tài)轉(zhuǎn)換的各個階段執(zhí)行一些額外的操作,比如記錄日志、發(fā)送通知等。

四、Spring 狀態(tài)機進階:處理復雜業(yè)務場景

(一)復合狀態(tài)和子狀態(tài)機

當業(yè)務場景比較復雜,狀態(tài)之間存在層次關(guān)系時,我們可以使用復合狀態(tài)和子狀態(tài)機。例如,訂單在支付過程中可能有支付中、支付成功、支付失敗等子狀態(tài),我們可以將支付過程定義為一個復合狀態(tài),其中包含這些子狀態(tài)。

public enum OrderState {
    CREATED,
    PAYING(CompositeState.PAYMENT), // 復合狀態(tài)
    PAID,
    PAYMENT_FAILED,
    SHIPPED,
    DELIVERED,
    CANCELED,
    REFUNDED
}

// 復合狀態(tài)枚舉
publicenum CompositeState {
    PAYMENT
}

在配置狀態(tài)機時,我們可以定義復合狀態(tài)及其子狀態(tài):

@Override
public void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {
    states
       .withStates()
           .initial(OrderState.CREATED)
           .states(EnumSet.allOf(OrderState.class))
           .and()
           .withCompositeStates()
               .withState(OrderState.PAYING, CompositeState.PAYMENT)
               .withStates(CompositeState.PAYMENT)
                   .initial(OrderState.PAYING)
                   .states(EnumSet.of(OrderState.PAYING, OrderState.PAID, OrderState.PAYMENT_FAILED));
}

(二)持久化狀態(tài)機上下文

在實際應用中,我們可能需要將狀態(tài)機的上下文(比如訂單對象)持久化,以便在應用重啟后能夠恢復狀態(tài)機的狀態(tài)。Spring 狀態(tài)機支持將狀態(tài)機的上下文持久化到數(shù)據(jù)庫或其他存儲介質(zhì)中,我們可以通過實現(xiàn) StateMachinePersist 接口來實現(xiàn)自定義的持久化邏輯。

(三)與外部系統(tǒng)交互

在狀態(tài)轉(zhuǎn)換過程中,可能需要與外部系統(tǒng)進行交互,比如調(diào)用支付接口、物流接口等。這時候,我們可以在動作中使用 Spring 的 RestTemplate 或其他客戶端來發(fā)起遠程調(diào)用,并處理調(diào)用結(jié)果。

@Bean
public Action<OrderState, OrderEvent> payAction() {
    return context -> {
        Order order = context.getMessage().getHeaders().get("order", Order.class);
        // 調(diào)用支付接口
        PaymentResponse response = restTemplate.postForObject(paymentUrl, order, PaymentResponse.class);
        if (response.isSuccess()) {
            order.setStatus(OrderState.PAID);
            order.setPaymentTime(new Date());
        } else {
            // 處理支付失敗,轉(zhuǎn)換到支付失敗狀態(tài)
            context.getStateMachine().transition(OrderEvent.PAYMENT_FAILED);
        }
    };
}

五、踩坑指南:使用 Spring 狀態(tài)機常見問題及解決辦法

(一)狀態(tài)轉(zhuǎn)換不生效

如果發(fā)現(xiàn)發(fā)送事件后狀態(tài)沒有轉(zhuǎn)換,首先要檢查配置的轉(zhuǎn)換規(guī)則是否正確,源狀態(tài)、目標狀態(tài)和事件是否匹配。其次,檢查守衛(wèi)條件是否返回 true,如果守衛(wèi)條件不滿足,轉(zhuǎn)換不會發(fā)生。另外,還要注意狀態(tài)機是否已經(jīng)啟動,在 Spring Boot 中,狀態(tài)機默認是自動啟動的,但如果在配置中關(guān)閉了自動啟動,需要手動調(diào)用 stateMachine.start() 方法。

(二)動作執(zhí)行順序問題

有時候,我們可能需要在狀態(tài)轉(zhuǎn)換的不同階段執(zhí)行不同的動作,比如在狀態(tài)轉(zhuǎn)換前執(zhí)行一些準備工作,在轉(zhuǎn)換后執(zhí)行一些清理工作。Spring 狀態(tài)機支持在轉(zhuǎn)換中定義多個動作,動作的執(zhí)行順序按照定義的順序進行。如果需要更精細地控制動作的執(zhí)行時機,可以使用 Action 接口的不同實現(xiàn),或者在配置中使用 beforeAction 和 afterAction 方法。

(三)狀態(tài)機上下文丟失

在使用狀態(tài)機時,上下文對象(比如訂單對象)通常是通過消息的頭部傳遞的。如果在狀態(tài)轉(zhuǎn)換過程中,上下文對象沒有正確傳遞,可能會導致動作或守衛(wèi)條件無法獲取到所需的數(shù)據(jù)。因此,在發(fā)送消息時,一定要確保上下文對象被正確設(shè)置到消息的頭部,并且在動作和守衛(wèi)條件中正確獲取。

(四)復雜狀態(tài)機調(diào)試困難

當狀態(tài)機配置比較復雜時,調(diào)試可能會比較困難。這時候,我們可以利用 Spring 狀態(tài)機提供的調(diào)試工具,比如打印狀態(tài)機的狀態(tài)和轉(zhuǎn)換信息,或者使用斷點調(diào)試來跟蹤狀態(tài)轉(zhuǎn)換的過程。另外,合理使用監(jiān)聽器來記錄狀態(tài)轉(zhuǎn)換的日志,也能幫助我們快速定位問題。

六、總結(jié):早用早受益,代碼優(yōu)雅不是夢

說了這么多,相信大家對 Spring 狀態(tài)機已經(jīng)有了一個比較清晰的認識了。使用 Spring 狀態(tài)機,我們可以將復雜的狀態(tài)邏輯從業(yè)務代碼中分離出來,通過配置的方式進行管理,讓代碼更加簡潔、優(yōu)雅、易維護。再也不用為了處理狀態(tài)邏輯而寫一堆惡心人的 if-else 了,媽媽再也不用擔心我的代碼會因為狀態(tài)判斷而出現(xiàn) bug 了。

當然,Spring 狀態(tài)機還有很多高級特性和應用場景等待我們?nèi)ヌ剿?,比如工作流引擎、有限狀態(tài)自動機等。只要我們合理運用,它就能成為我們開發(fā)過程中的得力助手,讓我們的代碼質(zhì)量更上一層樓。

責任編輯:武曉燕 來源: 石杉的架構(gòu)筆記
相關(guān)推薦

2020-10-15 10:38:35

C語言狀態(tài)模型

2025-10-29 07:38:45

2023-03-06 07:35:30

狀態(tài)機工具訂單狀態(tài)

2020-12-02 13:33:58

函數(shù)指針編程語言

2025-09-26 04:11:00

Spring狀態(tài)機業(yè)務流程

2010-06-18 12:38:38

UML狀態(tài)機視圖

2021-07-08 09:15:20

單片機編程狀態(tài)機編程語言

2010-06-18 13:25:44

UML狀態(tài)機視圖

2013-09-03 09:57:43

JavaScript有限狀態(tài)機

2025-08-28 01:12:00

狀態(tài)機系統(tǒng)編排

2021-06-05 05:11:52

代碼狀態(tài)機邏輯

2024-10-10 17:46:06

2024-04-16 09:21:59

Spring流轉(zhuǎn)狀態(tài)數(shù)據(jù)狀態(tài)處理

2010-07-08 13:03:31

UML狀態(tài)機圖

2011-06-24 16:09:24

Qt 動畫 狀態(tài)機

2022-03-06 19:57:50

狀態(tài)機easyfsm項目

2020-03-27 10:50:29

DSL 狀態(tài)機工具

2021-12-28 08:24:18

函數(shù)指針有限狀態(tài)機編程

2010-07-12 15:00:56

UML狀態(tài)機視圖

2021-08-19 09:00:00

微服務開發(fā)架構(gòu)
點贊
收藏

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

亚洲深夜激情| 国产精东传媒成人av电影| 国产精品无人区| 国产欧美日韩免费| 懂色av懂色av粉嫩av| 精品国产乱子伦一区二区| 日韩欧美成人免费视频| 亚洲人成影视在线观看| 蜜臀av在线观看| 日韩 欧美一区二区三区| 久久亚洲影音av资源网 | 亚洲欧美视频在线| 777一区二区| 欧美freesex黑人又粗又大| 国产欧美中文在线| 99电影网电视剧在线观看| 久久久久亚洲av成人毛片韩| 天天av综合| 亚洲欧美国内爽妇网| 一级淫片在线观看| 欧美18—19sex性hd| 亚洲精品成人天堂一二三| 欧美一区二区综合| 黑人乱码一区二区三区av| 免费观看30秒视频久久| 91av视频导航| 久久国产精品二区| 99精品全国免费观看视频软件| 日韩福利视频在线观看| 国产精品19p| 玖玖精品在线| 在线欧美小视频| 日本欧美黄色片| 污的网站在线观看| 国产精品久久久久久户外露出 | 一区二区三区四区毛片| 亚洲最大网站| 亚洲国产va精品久久久不卡综合| 亚洲欧洲久久| 成人性爱视频在线观看| 久久综合狠狠综合久久激情| 国产精品免费一区二区三区四区 | 秋霞电影一区二区| 欧美性资源免费| 国产极品在线播放| 女主播福利一区| 美女少妇精品视频| 成人在线观看免费完整| 91综合久久| 最新国产成人av网站网址麻豆| wwwwww日本| 亚洲制服欧美另类| 日韩成人在线观看| www.日本高清| 久久午夜影院| 日韩av在线天堂网| 一二三不卡视频| 欧美调教视频| 国产视频在线观看一区二区| 国产艳俗歌舞表演hd| 日韩美女国产精品| 国产视频一区在线| 一级在线观看视频| 欧洲美女日日| 日韩中文理论片| 小早川怜子一区二区的演员表| 日韩1区在线| 中文字幕在线观看日韩| 中国特黄一级片| 欧美韩国日本在线观看| 波霸ol色综合久久| 国产女人18水真多毛片18精品| 牛牛国产精品| 国产69精品久久久久9| 国产九色在线播放九色| 视频一区二区三区中文字幕| 国产精品女人久久久久久| 91好色先生tv| 成人性生交大片免费看中文网站| 国产亚洲精品久久飘花| 香港一级纯黄大片| 中文字幕欧美日本乱码一线二线| 中文字幕一区二区三区四区五区人| 成人在线观看亚洲| 亚洲成人av电影在线| 青青草原av在线播放| 成人在线高清| 欧美不卡一区二区三区| 大黑人交xxx极品hd| 日韩dvd碟片| 欧美激情极品视频| 一级黄色在线视频| 国产在线视视频有精品| 国产日韩亚洲精品| 永久免费av片在线观看全网站| 亚洲精品va在线观看| ww国产内射精品后入国产| 丁香久久综合| 亚洲国产一区二区三区四区| 国产精品成人在线视频| 国产精品激情电影| 国产精品视频网| 人妻一区二区三区四区| 国产精品视频你懂的| 黄色a级片免费看| 91成人在线| 亚洲第一av在线| 大胸美女被爆操| 亚洲精品乱码| 成人免费xxxxx在线观看| 日本v片在线免费观看| 国产精品第一页第二页第三页| 福利视频一二区| 日韩色性视频| 亚洲网站在线播放| 国产午夜福利片| 国内国产精品久久| 欧美高清视频一区二区三区在线观看| 国产成人久久精品| 99久久精品日本一区二区免费 | 在线亚洲+欧美+日本专区| 亚洲成人手机在线观看| 欧美精品色图| 88xx成人精品| 黄色aaa大片| 亚洲欧洲av另类| 熟女少妇精品一区二区| 米奇精品关键词| 精品中文字幕在线观看| 亚洲天堂一二三| 久久奇米777| 波多野结衣乳巨码无在线| 日韩在线观看一区二区三区| 中文字幕一区二区精品| 一二三区免费视频| 91视视频在线直接观看在线看网页在线看| av中文字幕av| 国产视频网站一区二区三区| 在线观看日韩专区| 18国产免费视频| 国产日韩精品一区二区三区| 92看片淫黄大片一级| 看全色黄大色大片免费久久久| 欧美成人性色生活仑片| 国产女人18毛片水真多| 亚洲天堂福利av| 99精品视频国产| 国产精品99一区二区三| 91久久精品美女| 免费黄网站在线播放| 91精品国产综合久久香蕉的特点| 欧美a级片免费看| 精品一区二区三区免费播放| 亚洲欧洲久久| 国产高清视频一区二区| x99av成人免费| 国产毛片毛片毛片毛片| 亚洲乱码国产乱码精品精可以看| 欧美体内she精高潮| 欧美日韩国产亚洲一区| 色又黄又爽网站www久久| 国产一区在线播放| 99青草视频在线播放视| 欧美精品一二三区| 青草草在线视频| 成人国产视频在线观看| 免费一级特黄特色毛片久久看| 久久国产精品色av免费看| 欧美一级大片在线观看| 国产系列在线观看| 欧美精品久久一区二区三区| 青青青在线免费观看| 国产东北露脸精品视频| 免费在线观看亚洲视频| 女人丝袜激情亚洲| 成人乱色短篇合集| 国产又色又爽又黄刺激在线视频| 日韩成人激情在线| 中国a一片一级一片| 日韩一区在线播放| 女女调教被c哭捆绑喷水百合| 日韩亚洲精品在线| 日韩精品国内| 精品国产亚洲一区二区三区大结局 | 亚洲综合123| 精品999日本| 日韩国产在线一区| 亚洲不卡视频| 欧美在线影院在线视频| 超碰在线国产| 欧美xxxx在线观看| 亚洲黄色免费观看| 中文字幕日韩欧美一区二区三区| 无码国产精品久久一区免费| 美女被久久久| 国产欧美自拍视频| 曰本一区二区三区视频| 亚洲一区国产精品| 超碰超碰人人人人精品| 久久综合伊人77777尤物| 无码国产精品一区二区色情男同| 欧美日韩中文精品| 久久精品这里有| 国产精品久久久久久户外露出| 亚洲香蕉中文网| 久久99精品国产麻豆不卡| 成人中文字幕在线播放| 亚洲综合小说| 日韩理论片在线观看| 91成人噜噜噜在线播放| 国产精品日日做人人爱| 欧美a级在线观看| 欧美超级免费视 在线| 国产永久免费高清在线观看视频| 日韩久久精品一区| 亚洲综合网av| 欧美色xxxx| 精品无码免费视频| 亚洲人精品午夜| 男人的天堂官网| 91亚洲男人天堂| 精品国产aⅴ一区二区三区东京热| 奇米影视一区二区三区| 国模吧无码一区二区三区| 欧美精品黄色| 免费看啪啪网站| 日韩精品久久久久久久电影99爱| 久久久影院一区二区三区| 日韩在线观看中文字幕| 91精品久久久久久久久不口人| 吉吉日韩欧美| 91高清免费视频| 美足av综合网| 欧美日韩福利在线观看| 国产原创视频在线观看| 社区色欧美激情 | 都市激情一区| 亚洲人成电影网| 欧美成人综合在线| 国产视频久久久久| 男人天堂资源在线| 日韩高清av一区二区三区| 蜜臀av中文字幕| 精品电影一区二区三区| 韩国av在线免费观看| 日韩久久久久久| 亚洲第一页在线观看| 日韩欧美国产麻豆| 国产av一区二区三区| 欧美一区二区在线不卡| 97av免费视频| 日韩一区二区三区四区| 国产手机视频在线| 精品少妇一区二区三区| 性网爆门事件集合av| 精品国产亚洲在线| 蜜桃久久一区二区三区| 亚洲精品一区二区三区在线观看| 丰满大乳国产精品| 亚洲精品美女久久| 理论视频在线| 在线一区二区日韩| 免费高清在线观看| 久久91超碰青草是什么| 蜜桃成人365av| 欧美孕妇性xx| av成人亚洲| 亚洲va欧美va国产综合剧情| 日韩一区二区三区精品视频第3页| av在线亚洲男人的天堂| 露出调教综合另类| 欧美日韩一区二区视频在线| 欧美一站二站| 91免费国产精品| 中文亚洲欧美| 国产九九热视频| 国产成人av福利| 最新中文字幕视频| 日本一区二区高清| 国产盗摄x88av| 狠狠躁夜夜躁人人躁婷婷91| 中文字幕av网站| 日韩丝袜情趣美女图片| 婷婷av一区二区三区| 在线观看日韩视频| 成人在线高清免费| 国产精品久久久久久久久久三级 | 国产精品久久国产三级国电话系列| 精品日产乱码久久久久久仙踪林| 欧美一级爽aaaaa大片| 综合久久精品| 欧美日韩在线不卡视频| 精品系列免费在线观看| av网站有哪些| 亚洲人成在线观看一区二区| 国产三级av片| 在线不卡一区二区| 青青操在线视频| 九九热最新视频//这里只有精品| 色是在线视频| 97免费资源站| 国产va免费精品观看精品视频| 中文字幕中文字幕99| 国产亚洲一区在线| 欧美视频国产视频| 久久午夜色播影院免费高清| 农村妇女精品一区二区| 色哟哟精品一区| 亚洲精品国产片| 日韩最新免费不卡| 小早川怜子影音先锋在线观看| 成人激情av在线| 国产剧情在线观看一区| 人人妻人人澡人人爽欧美一区双| 日本vs亚洲vs韩国一区三区二区 | 久久精品视频网站| 不卡福利视频| 精品亚洲欧美日韩| 国产精品v日韩精品v欧美精品网站| 污视频免费在线观看网站| 99这里只有精品| 国产一级一片免费播放放a| 欧美日本在线播放| 国产精品麻豆一区二区三区| 538国产精品视频一区二区| 亚洲精品国产九九九| 中文字幕乱码一区二区三区| 丝袜诱惑制服诱惑色一区在线观看 | 91在线成人| 欧美一级爽aaaaa大片| av不卡在线| 色综合久久五月| 亚洲国产成人porn| 亚洲精品久久久久久无码色欲四季| 久久天天躁夜夜躁狠狠躁2022| 久久国产三级| 亚洲高清视频一区| 日韩成人免费看| 五月婷婷婷婷婷| 欧美亚洲日本国产| 国产精品久久久久久久龚玥菲 | 国产超碰人人爽人人做人人爱| 欧美精品一区二区三区在线播放| 日本h片在线观看| 亚洲影院污污.| 欧美日韩国产成人精品| 日本少妇xxxx软件| 亚洲一区二区在线免费观看视频 | 一区二区三区av在线| 美女视频黄久久| 亚洲欧美综合7777色婷婷| 欧美日韩电影一区| 米奇777四色精品人人爽| 91亚洲人电影| 欧美日韩视频一区二区三区| 在线看黄色的网站| 精品国产乱码久久久久久虫虫漫画| 欧美一级在线免费观看| 69久久夜色精品国产69乱青草| 色愁久久久久久| 一区二区三区国产免费| 国产精品丝袜在线| 国产日韩欧美视频在线观看| 欧美另类极品videosbest最新版本 | 欧美日韩在线免费视频| 日本视频在线免费观看| 3d精品h动漫啪啪一区二区| 欧美88av| 亚洲一区二区三区综合| 欧美性猛交xxxxx水多| av在线资源站| 亚洲最大成人免费视频| 亚洲人www| 日韩影视一区二区三区| 91麻豆精品国产91久久久久久 | 日本精品性网站在线观看| 成人免费a**址| 国产伦精品一区二区三区妓女下载| 性做久久久久久久免费看| 激情小视频在线| 成人激情在线观看| 亚洲激情精品| 性欧美一区二区| 日韩欧美不卡在线观看视频| 在线能看的av网址| 亚洲在线不卡| 成人高清免费观看| 波多野结衣日韩| 欧美成人性色生活仑片| 九九久久精品| 99热这里只有精品2| 欧美三级xxx| 丝袜在线视频| 日韩精品电影网站| 成人免费视频网站在线观看| 成人黄色激情视频| 国内伊人久久久久久网站视频 | 亚洲精品毛片一区二区三区| 欧美不卡视频一区发布| 国产伦精品一区二区三区视频|