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

扒去Spring事件監(jiān)聽機(jī)制的外衣,竟然是觀察者模式

開發(fā) 前端
本篇文章帶大家從觀察者模式、Java事件機(jī)制延伸到Spring的事件監(jiān)聽機(jī)制,將三者融合在一起來講解。通過這個(gè)案例,其實(shí)我們能夠體會(huì)到一些經(jīng)驗(yàn)性的知識(shí),比如看似復(fù)雜的Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)只不過是觀察者模式的一種實(shí)現(xiàn),而其中又集成了Java的事件機(jī)制。這也就是所謂的融會(huì)貫通。

前言

Spring中提供了一套默認(rèn)的事件監(jiān)聽機(jī)制,在容器初始化時(shí)便使用了這套機(jī)制。同時(shí),Spring也提供了事件監(jiān)聽機(jī)制的接口擴(kuò)展能力,開發(fā)者基于此可快速實(shí)現(xiàn)自定義的事件監(jiān)聽功能。

Spring的事件監(jiān)聽機(jī)制是在JDK事件監(jiān)聽的基礎(chǔ)上進(jìn)行的擴(kuò)展,也是在典型觀察者模式上的進(jìn)一步抽象和改進(jìn)。所以,結(jié)合Spring的事件監(jiān)聽機(jī)制與觀察者模式來學(xué)習(xí),可以達(dá)到理論與實(shí)踐的完美融合。

本篇文章就以觀察者模式和Spring事件監(jiān)聽機(jī)制作為切入點(diǎn),結(jié)合具體的實(shí)例來對(duì)兩者進(jìn)行系統(tǒng)的學(xué)習(xí)和實(shí)踐。

觀察者模式

觀察者模式(Observer Pattern),也叫作發(fā)布-訂閱模式(Publish/Subscribe)。

無論是觀察者模式,還是Spring的事件監(jiān)聽機(jī)制,本質(zhì)上都是在定義對(duì)象間一對(duì)多的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象(被觀察者/事件)改變狀態(tài)時(shí),所有依賴于它的對(duì)象(觀察者/事件監(jiān)聽器)都會(huì)得到通知,并被自動(dòng)更新。

觀察者模式的優(yōu)點(diǎn)在于:觀察者和被觀察者之間是抽象耦合,不管是新增觀察者或是被觀察者,都非常容易擴(kuò)展。這也符合面向?qū)ο笏珜?dǎo)的“開閉原則”:對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。

觀察者模式適用于以下三類場(chǎng)景:

  • 關(guān)聯(lián)行為場(chǎng)景,而且關(guān)聯(lián)是可拆分的。
  • 事件多級(jí)觸發(fā)場(chǎng)景。
  • 跨系統(tǒng)的消息交換場(chǎng)景,比如消息隊(duì)列的處理機(jī)制。

在使用的過程中,也要綜合考慮開發(fā)效率和運(yùn)行效率的問題。通常,一個(gè)被觀察者會(huì)對(duì)應(yīng)多個(gè)觀察者,那么在開發(fā)和調(diào)試的過程中會(huì)有一定的復(fù)雜度。

同時(shí),因?yàn)楸挥^察者存在關(guān)聯(lián)、多級(jí)拆分,也就是會(huì)有多個(gè)觀察者,而Java消息的通知(和Spring的事件監(jiān)聽機(jī)制)默認(rèn)是順序執(zhí)行的,如果其中一個(gè)觀察者執(zhí)行時(shí)間過長(zhǎng)或卡死,勢(shì)必會(huì)影響整體的效率。此時(shí),就需要考慮異步處理。

觀察者的角色定義

觀察者模式是一個(gè)典型的發(fā)布-訂閱模型,其中主要涉及四個(gè)角色:

  • 抽象被觀察者角色:內(nèi)部持有所有觀察者角色的引用,并對(duì)外提供新增、移除觀察者角色、通知所有觀察者的功能;
  • 具體被觀察者角色:當(dāng)狀態(tài)變更時(shí),會(huì)通知到所有的觀察者角色;
  • 抽象觀察者角色:抽象具體觀察者角色的一些共性方法,如狀態(tài)變更方法;
  • 具體觀察者角色:實(shí)現(xiàn)抽象觀察者角色的方法;

UML類圖展示類觀察者模式大體如下:

圖片

觀察者模式類圖

以具體的代碼來展示一下觀察者模式的實(shí)現(xiàn)。

第一,定義抽象觀察者。

/**
* 抽象觀察者角色
* @author sec
**/
public abstract class AbstractObserver {

/**
* 接收消息
* @param context 消息內(nèi)容
*/
public abstract void receiveMsg(String context);

}

第二,定義抽象被觀察者。

/**
* 抽象主題(抽象被觀察者角色)
* @author sec
**/
public abstract class AbstractSubject {

/**
* 持有所有抽象觀察者角色的集合引用
*/
private final List<AbstractObserver> observers = new ArrayList<>();

/**
* 添加一個(gè)觀察者
* @param observer 觀察者
*/
public void addObserver(AbstractObserver observer){
observers.add(observer);
}

/**
* 移除一個(gè)觀察者
* @param observer 觀察者
*/
public void removeObserver(AbstractObserver observer){
observers.remove(observer);
}

/**
* 通知所有的觀察者,執(zhí)行觀察者更新方法
* @param context 通知內(nèi)容
*/
public void notifyObserver(String context){
observers.forEach(observer -> observer.receiveMsg(context));
}
}

第三,定義具體被觀察者,實(shí)現(xiàn)了抽象被觀察者。

/**
* 具體被觀察者
* @author sec
**/
public class ConcreteSubject extends AbstractSubject{

/**
* 被觀察者發(fā)送消息
* @param context 消息內(nèi)容
*/
public void sendMsg(String context){
System.out.println("具體被觀察者角色發(fā)送消息: " + context);
super.notifyObserver(context);
}
}

第四,定義具體觀察者,實(shí)現(xiàn)了抽象觀察者。

/**
* 具體觀察者角色實(shí)現(xiàn)類
* @author sec
**/
public class ConcreteObserver extends AbstractObserver{

@Override
public void receiveMsg(String context) {
System.out.println("具體觀察者角色接收消息: " + context);
}
}

第五,使用演示類。

public class ObserverPatternTest {

public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.addObserver(new ConcreteObserver());
subject.sendMsg("Hello World!");
}
}

執(zhí)行上述方法,控制臺(tái)打印日志為:

具體被觀察者角色發(fā)送消息: Hello World!
具體觀察者角色接收消息: Hello World!

在上述代碼實(shí)現(xiàn)中,被觀察者發(fā)出消息后,觀察者接收到具體的消息,如果添加了多個(gè)觀察者,它們均會(huì)收到消息。也就是前面所說的,每當(dāng)一個(gè)對(duì)象(被觀察者/事件)改變狀態(tài)時(shí),所有依賴于它的對(duì)象(觀察者/事件監(jiān)聽器)都會(huì)得到通知,并被自動(dòng)更新。

Java中的事件機(jī)制

前面聊了觀察者模式,這里再來看看Java中的事件機(jī)制。

在JDK 1.1及以后版本中,事件處理模型采用基于觀察者模式的委派事件模型(DelegationEvent Model, DEM),即一個(gè)Java組件所引發(fā)的事件并不由引發(fā)事件的對(duì)象自己來負(fù)責(zé)處理,而是委派給獨(dú)立的事件處理對(duì)象負(fù)責(zé)。

這并不是說事件模型是基于Observer和Observable的,事件模型與Observer和Observable沒有任何關(guān)系,Observer和Observable只是觀察者模式的一種實(shí)現(xiàn)而已。

Java中的事件機(jī)制有三個(gè)角色參與:

  • Event Source:事件源,發(fā)起事件的主體。
  • Event Object:事件狀態(tài)對(duì)象,傳遞的信息載體,可以是事件源本身,一般作為參數(shù)存在于listerner的方法之中。所有事件狀態(tài)對(duì)象都將從Java中的EventObject派生而來;
  • Event Listener:事件監(jiān)聽器,當(dāng)監(jiān)聽到EventObject產(chǎn)生時(shí),調(diào)用相應(yīng)的方法進(jìn)行處理。所有事件偵聽器接口必須擴(kuò)展EventListener接口;

UML類圖展示類事件模式大體如下:

圖片

事件監(jiān)聽

在上面的UML圖中,EventObject一般作為L(zhǎng)istener處理方法的參數(shù)傳入,而EventSource是事件的觸發(fā)者,通過此對(duì)象注冊(cè)相關(guān)的Listener,然后向Listener觸發(fā)事件。

通過UML圖的對(duì)比可以看出,事件監(jiān)聽模式和觀察者模式大同小異,它們屬于同一類型模式,都屬于回調(diào)機(jī)制,主動(dòng)推送消息,但在使用場(chǎng)景上有所區(qū)別。

觀察者(Observer)相當(dāng)于事件監(jiān)聽者(監(jiān)聽器),被觀察者(Observable)相當(dāng)于事件源和事件,事件監(jiān)聽比觀察者模式要復(fù)雜一些,多了EventSource角色的存在。

以具體的代碼來展示一下Java中的事件機(jī)制實(shí)現(xiàn)。

第一,定義事件對(duì)象。

/**
* 事件對(duì)象
*
* @author sec
**/
public class DoorEvent extends EventObject {

private int state;

/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public DoorEvent(Object source) {
super(source);
}

public DoorEvent(Object source, int state) {
super(source);
this.state = state;
}

// 省略getter/setter方法
}

第二,定義事件監(jiān)聽器接口。

/**
* 事件監(jiān)聽器接口
*
* @author sec
**/
public interface DoorListener extends EventListener {

/**
* 門處理事件
* @param doorEvent 事件
*/
void doorEvent(DoorEvent doorEvent);
}

第三,定義事件監(jiān)聽器的實(shí)現(xiàn)類。

public class CloseDoorListener implements DoorListener{
@Override
public void doorEvent(DoorEvent doorEvent) {
if(doorEvent.getState() == -1){
System.out.println("門關(guān)上了");
}
}
}

public class OpenDoorListener implements DoorListener{
@Override
public void doorEvent(DoorEvent doorEvent) {
if(doorEvent.getState() == 1){
System.out.println("門打開了");
}
}
}

這里實(shí)現(xiàn)了門的開和關(guān)兩個(gè)事件監(jiān)聽器類。

第四,定義事件源EventSource。

public class EventSource {

//監(jiān)聽器列表,監(jiān)聽器的注冊(cè)則加入此列表
private Vector<DoorListener> listenerList = new Vector<>();

//注冊(cè)監(jiān)聽器
public void addListener(DoorListener eventListener) {
listenerList.add(eventListener);
}

//撤銷注冊(cè)
public void removeListener(DoorListener eventListener) {
listenerList.remove(eventListener);
}

//接受外部事件
public void notifyListenerEvents(DoorEvent event) {
for (DoorListener eventListener : listenerList) {
eventListener.doorEvent(event);
}
}
}

第五,測(cè)試類。

public class EventTest {

public static void main(String[] args) {
EventSource eventSource = new EventSource();
eventSource.addListener(new CloseDoorListener());
eventSource.addListener(new OpenDoorListener());

eventSource.notifyListenerEvents(new DoorEvent("關(guān)門事件", -1));
eventSource.notifyListenerEvents(new DoorEvent("開門時(shí)間", 1));
}
}

執(zhí)行測(cè)試類,控制臺(tái)打印:

門關(guān)上了
門打開了

事件成功觸發(fā)。

Spring中的事件機(jī)制

在了解了觀察者模式和Java的事件機(jī)制之后,再來看看Spring中的事件機(jī)制。在Spring容器中,通過ApplicationEvent和ApplicationListener接口來實(shí)現(xiàn)事件監(jiān)聽機(jī)制。每次Event事件被發(fā)布到Spring容器中,都會(huì)通知對(duì)應(yīng)的Listener。默認(rèn)情況下,Spring的事件監(jiān)聽機(jī)制是同步的。

Spring的事件監(jiān)聽由三部分組成:

  • 事件(ApplicationEvent):該類繼承自JDK中的EventObject,負(fù)責(zé)對(duì)應(yīng)相應(yīng)的監(jiān)聽器,事件源發(fā)生某事件是特定事件監(jiān)聽器被觸發(fā)的原因;
  • 監(jiān)聽器(ApplicationListener):該類繼承自JDK中的EventListener,對(duì)應(yīng)于觀察者模式中的觀察者。監(jiān)聽器監(jiān)聽特定事件,并在內(nèi)部定義了事件發(fā)生后的響應(yīng)邏輯;
  • 事件發(fā)布器(ApplicationEventPublisher):對(duì)應(yīng)于觀察者模式中的被觀察者/主題,負(fù)責(zé)通知觀察者,對(duì)外提供發(fā)布事件和增刪事件監(jiān)聽器的接口,維護(hù)事件和事件監(jiān)聽器之間的映射關(guān)系,并在事件發(fā)生時(shí)負(fù)責(zé)通知相關(guān)監(jiān)聽器。

通過上面的分析可以看出Spring的事件機(jī)制不僅是觀察者模式的一種實(shí)現(xiàn),也實(shí)現(xiàn)了JDK提供的事件接口。同時(shí),除了發(fā)布者和監(jiān)聽者之外,還存在一個(gè)EventMulticaster的角色,負(fù)責(zé)把事件轉(zhuǎn)發(fā)給監(jiān)聽者。

Spring事件機(jī)制的工作流程如下:

圖片

Spring事件機(jī)制

在上述流程中,發(fā)布者調(diào)用applicationEventPublisher.publishEvent(msg),將事件發(fā)送給EventMultiCaster。EventMultiCaster注冊(cè)著所有的Listener,它會(huì)根據(jù)事件類型決定轉(zhuǎn)發(fā)給那個(gè)Listener。

在Spring中提供了一些標(biāo)準(zhǔn)的事件,比如:ContextRefreshEvent、ContextStartedEvent、ContextStoppedEvent、ContextClosedEvent、RequestHandledEvent等。

關(guān)于Spring事件機(jī)制的具體實(shí)現(xiàn)和這些標(biāo)準(zhǔn)事件的作用,大家可以通過閱讀源碼來學(xué)習(xí),這里不再詳細(xì)展開。

下面來看看Spring事件機(jī)制涉及到的幾個(gè)角色的源碼及后續(xù)基于它們的實(shí)踐。

第一,事件(ApplicationEvent)。

public abstract class ApplicationEvent extends EventObject {

/** use serialVersionUID from Spring 1.2 for interoperability. */
private static final long serialVersionUID = 7099057708183571937L;

/** System time when the event happened. */
private final long timestamp;

/**
* Create a new {@code ApplicationEvent}.
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public ApplicationEvent(Object source) {
super(source);
this.timestamp = System.currentTimeMillis();
}

/**
* Return the system time in milliseconds when the event occurred.
*/
public final long getTimestamp() {
return this.timestamp;
}

}

事件可類比觀察者中的被觀察者實(shí)現(xiàn)類的角色,繼承自JDK的EventObject。上述Spring中的標(biāo)準(zhǔn)事件都是直接或間接繼承自該類。

第二,事件發(fā)布器(ApplicationEventPublisher)。

@FunctionalInterface
public interface ApplicationEventPublisher {

default void publishEvent(ApplicationEvent event) {
publishEvent((Object) event);
}

void publishEvent(Object event);
}

通過實(shí)現(xiàn)ApplicationEventPublisher接口,并重寫publishEvent()方法,可以自定義事件發(fā)布的邏輯。ApplicationContext繼承了ApplicationEventPublisher接口。因此,我們可以通過實(shí)現(xiàn)ApplicationContextAware接口,注入ApplicationContext,然后通過ApplicationContext的publishEvent()方法來實(shí)現(xiàn)事件發(fā)布功能。

ApplicationContext容器本身僅僅是對(duì)外提供了事件發(fā)布的接口publishEvent(),真正的工作委托給了具體容器內(nèi)部的ApplicationEventMulticaster對(duì)象。而ApplicationEventMulticaster對(duì)象可類比觀察者模式中的抽象被觀察者角色,負(fù)責(zé)持有所有觀察者集合的引用、動(dòng)態(tài)添加、移除觀察者角色。

第三,事件監(jiān)聽器(ApplicationListener)。

@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {

/**
* Handle an application event.
* @param event the event to respond to
*/
void onApplicationEvent(E event);

}

事件監(jiān)聽器(ApplicationListener)對(duì)應(yīng)于觀察者模式中的具體觀察者角色。當(dāng)事件發(fā)布之后,就會(huì)執(zhí)行事件監(jiān)聽器的邏輯。通過實(shí)現(xiàn)ApplicationListener接口,并重寫onApplicationEvent()方法,就可以監(jiān)聽到事件發(fā)布器發(fā)布的事件。

Spring事件監(jiān)聽案例

下面以具體的案例代碼來說明如何自定義實(shí)現(xiàn)Spring事件監(jiān)聽。

第一,自定義定義事件對(duì)象,集成自ApplicationEvent。

public class MyEvent extends ApplicationEvent {
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public MyEvent(Object source) {
super(source);
}

private String context;

public MyEvent(Object source, String context){
super(source);
this.context = context;
}

public String getContext() {
return context;
}

public void setContext(String context) {
this.context = context;
}
}

第二,自定義ApplicationListener事件監(jiān)聽器。

@Component
public class MyApplicationListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
// 監(jiān)聽到具體事件,處理對(duì)應(yīng)具體邏輯
System.out.println("event.getContext() = " + event.getContext());
}

}

除了上述基于實(shí)現(xiàn)ApplicationListener接口的方式外,還可以使用**@EventListener**注解來實(shí)現(xiàn),實(shí)現(xiàn)示例如下:

@Component
public class MyApplicationListener{

// 通過注解實(shí)現(xiàn)監(jiān)聽器
@EventListener
public void handleMyEvent(MyEvent event){
// 監(jiān)聽到具體事件,處理對(duì)應(yīng)具體邏輯
System.out.println("event.getContext() = " + event.getContext());
}
}

第三,使用及單元測(cè)試。

@Slf4j
@SpringBootTest
public class SpringEventTest {

@Autowired
private ApplicationEventPublisher eventPublisher;

@Test
void testEvent() {
eventPublisher.publishEvent(new MyEvent("自定義事件", "Hello World!"));
}
}

執(zhí)行單元測(cè)試,可看到控制臺(tái)打印對(duì)應(yīng)的事件信息。

通過上述方式我們已經(jīng)成功實(shí)現(xiàn)了基于Spring的事件監(jiān)聽機(jī)制,但這其中還有一個(gè)問題:同步處理。默認(rèn)情況下,上述事件是基于同步處理的,如果其中一個(gè)監(jiān)聽器阻塞,那么整個(gè)線程將處于等待狀態(tài)。

那么,如何使用異步方式處理監(jiān)聽事件呢?只需兩步即可。

第一步,在監(jiān)聽器類或方法上添加@Async注解,例如:

@Component
@Async
public class MyApplicationListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
// 監(jiān)聽到具體事件,處理對(duì)應(yīng)具體邏輯
System.out.println("event.getContext() = " + event.getContext());
}

}

第二步,在SpringBoot啟動(dòng)類(這里以SpringBoot項(xiàng)目為例)上添加@EnableAsync注解,例如:

@SpringBootApplication
@EnableAsync
public class SpringBootMainApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootMainApplication.class, args);
}
}

此時(shí),就可以實(shí)現(xiàn)異步監(jiān)聽功能了。當(dāng)然,@Async注解也可以指定我們已經(jīng)配置好的線程池來處理異步請(qǐng)求,關(guān)于線程數(shù)的初始化這里就不再演示了。

小結(jié)

本篇文章帶大家從觀察者模式、Java事件機(jī)制延伸到Spring的事件監(jiān)聽機(jī)制,將三者融合在一起來講解。通過這個(gè)案例,其實(shí)我們能夠體會(huì)到一些經(jīng)驗(yàn)性的知識(shí),比如看似復(fù)雜的Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)只不過是觀察者模式的一種實(shí)現(xiàn),而其中又集成了Java的事件機(jī)制。這也就是所謂的融會(huì)貫通。

我們?nèi)绻麊渭兊膶W(xué)習(xí)某一個(gè)設(shè)計(jì)模式,可能只會(huì)運(yùn)用和識(shí)別它的簡(jiǎn)單實(shí)現(xiàn),而實(shí)踐中往往會(huì)對(duì)設(shè)計(jì)模式進(jìn)行變種,甚至融合多種設(shè)計(jì)模式的優(yōu)點(diǎn)于一體,這便是活學(xué)活用。希望通過這邊文章你能夠更加深入的理解上述三者。

參考文章:

??https://blog.csdn.net/Weixiaohuai/article/details/122367792??

??https://www.cnblogs.com/admol/p/14036564.html??

??https://blog.csdn.net/qq_30364247/article/details/123168800??

??https://cloud.tencent.com/developer/article/1701947??

??https://www.jianshu.com/p/81a8ca9a6ffa??

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2024-12-03 09:34:35

觀察者模 式編程Javav

2021-03-29 07:14:28

Spring觀察者模式

2020-10-26 08:45:39

觀察者模式

2021-09-06 10:04:47

觀察者模式應(yīng)用

2022-01-29 22:12:35

前端模式觀察者

2021-07-08 11:28:43

觀察者模式設(shè)計(jì)

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2011-04-29 09:22:22

2021-07-28 06:51:08

Nacos代理模式

2021-07-08 07:52:49

容器監(jiān)聽器Event

2021-04-14 14:40:37

forSpringJava

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-06-07 20:03:04

監(jiān)聽器模式觀察者

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2015-11-25 11:10:45

Javascript設(shè)計(jì)觀察

2024-02-18 12:36:09

2009-03-30 09:39:04

觀察者思想換位設(shè)計(jì)模式

2021-08-05 06:54:05

觀察者訂閱設(shè)計(jì)

2024-06-04 13:11:52

Python行為設(shè)計(jì)模式開發(fā)

2025-05-20 07:13:22

Spring異步解耦Event
點(diǎn)贊
收藏

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

日韩精品一区二区三区久久| 国产精品v欧美精品v日韩精品| 欧美亚洲色综久久精品国产| 日韩在线电影| 亚洲欧美综合网| 国产精品久久国产精品| 无码人妻一区二区三区免费| 欧美91视频| 亚洲色图日韩av| 日本成人在线免费观看| 在线毛片观看| 亚洲免费观看高清完整版在线观看 | 在线电影院国产精品| www 日韩| 婷婷电影在线观看| 国产日韩一级二级三级| 91丨九色丨国产| 日韩免费av网站| 激情国产一区| 色老头一区二区三区在线观看| 国产综合内射日韩久| 福利精品一区| 日韩欧美亚洲综合| 国产欧美精品aaaaaa片| 在线免费看黄网站| 91色综合久久久久婷婷| 99国精产品一二二线| 中文区中文字幕免费看| 国产一区二区三区的电影 | 91在线观看网站| 国产精品尤物视频| 亚洲女人av| 免费观看在线综合| 久久91亚洲精品中文字幕奶水| 日韩av在线看免费观看| 国产另类在线| 日韩欧美精品在线视频| 亚洲视频第二页| 亚洲精品555| 色视频一区二区| 欧美日韩二三区| av免费不卡国产观看| 亚洲欧美日韩电影| 综合操久久久| 免费av在线网站| 国产精品美女久久久久久2018| 欧美一区二区三区成人久久片 | 亚洲视频免费播放| 国产精品va| 久精品免费视频| 欧美特级一级片| 亚洲综合五月| 久久99久久99精品免观看粉嫩| 懂色av蜜臀av粉嫩av永久| 第一会所sis001亚洲| 国产亚洲a∨片在线观看| 中文字幕人妻一区二区| 宅男在线一区| 中文字幕免费精品一区高清| 91狠狠综合久久久久久| 色一区二区三区四区| 中文字幕一精品亚洲无线一区 | 国模大尺度视频| 免费一级欧美在线大片 | 国产玉足榨精视频在线观看| 国产日本欧洲亚洲| 一区二区免费电影| 最新黄网在线观看| 亚洲成人动漫av| 成人免费观看视频在线观看| 巨茎人妖videos另类| 欧洲在线/亚洲| 粉色视频免费看| 视频一区日韩| 日韩电影在线观看中文字幕| av电影在线不卡| 亚洲成人国产| 97久久精品视频| 久久久精品毛片| 韩国女主播成人在线观看| 国产精品99久久久久久久| 十九岁完整版在线观看好看云免费| 久久久精品蜜桃| 少妇熟女一区二区| a级片免费在线观看| 91黄色免费看| 巨乳女教师的诱惑| 自拍偷拍欧美一区| 久久久精品久久久| 五月婷婷亚洲综合| 久久91精品国产91久久小草| 国产精品手机视频| 91社区在线观看| 亚洲国产一区在线观看| 亚洲欧美另类动漫| 日本一区二区三区播放| 亚洲午夜久久久久久久| 青青操视频在线播放| 三级欧美在线一区| 超碰97在线播放| 91在线品视觉盛宴免费| 午夜激情一区二区三区| 不卡的在线视频| 亚洲最好看的视频| 欧美老女人性生活| 中文字幕人妻一区二区三区视频| 北岛玲一区二区三区四区| 亚洲国产欧美不卡在线观看| 18video性欧美19sex高清| 精品视频免费在线| 欧美大片免费播放器| 亚洲精品中文字幕乱码| 国产99久久精品一区二区 夜夜躁日日躁 | 亚洲视频自拍偷拍| 国产精品99无码一区二区| 另类小说视频一区二区| 欧美日韩精品中文字幕一区二区| 欧美人与牲禽动交com| 欧美日韩精品欧美日韩精品一综合| 亚洲综合自拍网| 真实国产乱子伦精品一区二区三区| 国产91在线播放九色快色| 手机看片1024日韩| 亚洲影院免费观看| 久久精品国产99久久99久久久| 九九久久电影| 4k岛国日韩精品**专区| 欧美性受xxxx狂喷水| 亚洲欧美色图小说| 91极品视频在线观看| 国产99亚洲| 青草青草久热精品视频在线网站 | 国产福利第一页| 中文字幕在线一区二区三区| 亚洲成色www.777999| 神马久久一区二区三区| 日本久久久久亚洲中字幕| 婷婷视频在线观看| 午夜电影一区二区| 五十路六十路七十路熟婆 | 亚洲精品久久7777| 亚洲欧美天堂在线| 亚洲欧美网站在线观看| 91牛牛免费视频| 国产在线更新| 日韩欧美的一区二区| 免费人成年激情视频在线观看| 蜜桃视频一区二区三区在线观看| 色一情一乱一伦一区二区三欧美| 唐人社导航福利精品| 亚洲人成电影网站| 欧美国产一级片| 国产欧美中文在线| 亚洲最大天堂网| 在线精品视频在线观看高清| 古典武侠综合av第一页| av在线最新| 亚洲美女视频网站| 在线免费看毛片| 亚洲三级在线免费观看| 成人一区二区三区仙踪林| 亚洲天堂成人| 欧美aaaaa喷水| 久久av影院| 欧美人在线观看| 五月激情婷婷综合| 欧洲另类一二三四区| 极品尤物一区二区| 国产成人av福利| av在线播放亚洲| 欧美日韩国产在线观看网站| 成人欧美在线视频| 成人三级小说| 在线观看日韩www视频免费| 国产精品高潮呻吟av| 亚洲国产中文字幕| 国产人妻大战黑人20p| 久草热8精品视频在线观看| 毛片av在线播放| 欧美**vk| 亚洲永久免费观看| 一级毛片久久久| www.日韩av.com| 免费观看国产精品| 欧美色网一区二区| 国产乡下妇女做爰视频| 国产三级精品在线| 亚洲AV无码久久精品国产一区| 亚洲美女少妇无套啪啪呻吟| 视频一区二区在线观看| 凹凸成人在线| 国产精品视频在线播放| 99热99re6国产在线播放| 这里只有精品丝袜| 欧美自拍第一页| 欧美日韩一区中文字幕| 日韩黄色a级片| 中文字幕在线一区免费| 成人免费网站黄| 国产精品一区在线| 男人添女人下面免费视频| 最新成人av网站| 正在播放国产精品| 国产精品一在线观看| 国产精品久久久久久免费观看| 亚洲a∨精品一区二区三区导航| 欧美第一黄色网| 天堂资源在线中文| 亚洲欧洲xxxx| 天堂中文在线资源| 日韩女优视频免费观看| 中文字幕在线网址| 色婷婷久久一区二区三区麻豆| 欧美成人三级视频| 国产精品久久久久久久久久免费看| 免费在线观看你懂的| 成人性生交大片免费看中文网站| 亚洲久久中文字幕| 日韩成人免费看| 人妻精品无码一区二区三区 | 特黄特黄一级片| 奇米色777欧美一区二区| 干日本少妇首页| 亚洲一区欧美二区| 亚洲美免无码中文字幕在线| 国产精品mv在线观看| 亚洲免费视频播放| 天堂网在线观看国产精品| 日本精品一区二区三区高清 久久| 国产香蕉精品| 国产伦精品一区二区三区视频黑人 | 91久久夜色精品国产九色| 菠萝蜜视频在线观看入口| 永久亚洲成a人片777777| 最新国产精品久久| 无码一区二区三区视频| 一区二区三区四区视频在线观看| 精品黄色一级片| 色综合视频二区偷拍在线| 国内黄色精品| 亚洲精品成人三区| 久久精品高清| 精品一区二区成人免费视频 | 亚洲精品一区二区三区四区| 欧美一级xxx| 精品区在线观看| 日韩精品中文字幕在线不卡尤物| 国产黄色av网站| 精品国产乱码久久久久久久久| 亚洲国产综合一区| 亚洲成人久久久久| 日本在线丨区| 亚洲美腿欧美激情另类| 国产经典自拍视频在线观看| 伊是香蕉大人久久| 日韩精品资源| 色爱综合av| 日本欧洲国产一区二区| 91麻豆成人精品国产| 国产99亚洲| 欧美日韩亚洲在线| 第一会所亚洲原创| 国产人妻互换一区二区| 海角社区69精品视频| 免费av手机在线观看| 亚洲欧美成人| 在线观看国产中文字幕| 国产精品911| 国产黑丝一区二区| 国产午夜精品一区二区三区视频 | 精品久久在线播放| 成人黄色三级视频| 欧美一区二区三区在线视频 | 神马久久久久久| a级毛片免费观看在线| 午夜精品视频在线| 91成人在线| 国产精华一区二区三区| 国产伦一区二区三区| 亚洲小说欧美另类激情| 国产欧美日韩一级| 国产成人黄色网址| 成人午夜在线免费| 亚洲一区二区自偷自拍| 亚洲精品日产精品乱码不卡| 欧美三级午夜理伦| 在线综合+亚洲+欧美中文字幕| 欧美一级淫片aaaaaa| 中文字幕日韩欧美在线| 草草影院在线| 国产精品永久在线| 日韩av三区| 欧洲xxxxx| 久久精品网址| 国产又黄又嫩又滑又白| 亚洲国产精华液网站w| 国产一级做a爱免费视频| 欧美亚洲丝袜传媒另类| 黄色三级网站在线观看| 中文字幕精品网| 九色porny视频在线观看| 91中文字幕在线| 国产精品最新| 国产 福利 在线| 国产suv精品一区二区三区| 在线观看免费黄色网址| 狠狠综合久久av一区二区小说 | 成人国产精品久久| 欧美精品在线一区| 99精品视频免费全部在线| 午夜大片在线观看| 中文字幕国产精品一区二区| av黄色在线看| 亚洲国产成人精品女人久久久 | 精品国产一区在线| 一区二区三区四区蜜桃| 92久久精品一区二区| 亚洲美女在线视频| av综合电影网站| 久久99国产精品99久久| 国产精品av久久久久久麻豆网| 国产福利精品一区二区三区| 欧美激情中文不卡| 欧美一区二区三区网站| 日韩精品极品在线观看播放免费视频| 四虎av在线| av一区二区三区四区电影| 国产高清一区二区| 色www免费视频| 中文字幕视频一区| 一个人看的www日本高清视频| 亚洲人成电影在线观看天堂色| 日韩欧美精品一区二区三区| 国产视频在线观看一区| 亚洲区一区二| v天堂中文在线| 精品国产乱码久久久久酒店| 天天干天天舔天天射| 久久久免费精品| 精品无人区一区二区| 久久视频这里有精品| 99视频热这里只有精品免费| 99免费在线观看| 亚洲高清福利视频| 天堂√中文最新版在线| 欧美精品亚洲| 青青草原综合久久大伊人精品优势| 国产亚洲精品熟女国产成人| 日本久久精品电影| freemovies性欧美| 91视频免费在线| 国产精品地址| 亚洲欧美视频在线播放| 色综合久久九月婷婷色综合| 成年人视频网站在线| 国产日韩精品电影| 亚洲欧洲日韩| 久久人妻少妇嫩草av无码专区| 欧美日韩在线影院| 成人在线观看免费| 91免费国产网站| 亚洲大胆在线| 蜜桃av乱码一区二区三区| 欧美日韩一本到| 欧美人与禽猛交乱配| 久久国产日韩欧美| 麻豆91在线看| 久久免费小视频| 亚洲毛茸茸少妇高潮呻吟| 国产精品蜜月aⅴ在线| 黄网站色视频免费观看| 久久女同性恋中文字幕| 亚洲字幕av一区二区三区四区| 美女精品久久久| 日韩mv欧美mv国产网站| 午夜两性免费视频| 亚洲一二三四久久| 国产视频精选在线| 91精品国产高清久久久久久91裸体| 亚洲狼人精品一区二区三区| 男女做爰猛烈刺激| 日韩免费视频一区| 久久精品女人天堂av免费观看 | 国产精品久久久久av电视剧| 中文字幕一区二区三区在线乱码| 成人av在线播放网站| 天天射天天干天天| 欧美高清在线视频观看不卡| 国产免费久久| 亚洲少妇中文字幕| 欧美日韩中文国产| missav|免费高清av在线看| 日韩一区二区三区高清| 成人性生交大片免费看中文| 中文字幕免费播放| 88国产精品欧美一区二区三区| 99re6这里只有精品| 亚洲色图14p| 日韩欧美国产综合在线一区二区三区 | 亚洲综合精品自拍|