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

聊一聊責(zé)任鏈模式

開(kāi)發(fā) 前端
責(zé)任鏈模式(Chain of Responsibility Pattern)是將鏈中每一個(gè)節(jié)點(diǎn)看作是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不同,且內(nèi)部自動(dòng)維護(hù)一個(gè)下一節(jié)點(diǎn)對(duì)象。當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止,屬于行為型模式。

一、概述

責(zé)任鏈模式(Chain of Responsibility Pattern)是將鏈中每一個(gè)節(jié)點(diǎn)看作是一個(gè)對(duì)象,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不同,且內(nèi)部自動(dòng)維護(hù)一個(gè)下一節(jié)點(diǎn)對(duì)象。當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出時(shí),會(huì)沿著鏈的路徑依次傳遞給每一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止,屬于行為型模式。下面放一張足球比賽的圖,通過(guò)層層傳遞,最終射門(mén)。通過(guò)這張圖,可以更好的理解責(zé)任鏈模式。

圖片

二、入門(mén)案例

2.1 類(lèi)圖

圖片

2.2 基礎(chǔ)類(lèi)介紹

抽象接口RequestHandler

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 13:41
* @description
*/
public interface RequestHandler {

void doHandler(String req);
}

抽象類(lèi)BaseRequestHandler

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 13:45
* @description
*/
public abstract class BaseRequestHandler implements RequestHandler {

protected RequestHandler next;

public void next(RequestHandler next){
this.next = next;
}
}

具體處理類(lèi)AHandler

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 14:00
* @description
*/
public class AHandler extends BaseRequestHandler {

@Override
public void doHandler(String req){
// 處理自己的業(yè)務(wù)邏輯
System.out.println("A中處理自己的邏輯");
// 傳遞給下個(gè)類(lèi)(若鏈路中還有下個(gè)處理類(lèi))
if (next != null) {
next.doHandler(req);
}
}
}

當(dāng)然還有具體的處理類(lèi)B、C等等,這里不展開(kāi)贅述。

 使用類(lèi)Client

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 14:06
* @description
*/
public class Client {
public static void main(String[] args){
BaseRequestHandler a = new AHandler();
BaseRequestHandler b = new BHandler();
BaseRequestHandler c = new CHandler();
a.next(b);
b.next(c);
a.doHandler("鏈路待處理的數(shù)據(jù)");
}
}

2.3 處理流程圖

圖片

三、應(yīng)用場(chǎng)景

3.1 場(chǎng)景舉例

場(chǎng)景一

前兩年,在一家金融公司待過(guò)一段時(shí)間,其中就有一個(gè)業(yè)務(wù)場(chǎng)景:一筆訂單進(jìn)來(lái),會(huì)先在后臺(tái)通過(guò)初審人員進(jìn)行審批,初審不通過(guò),訂單流程結(jié)束。初審?fù)ㄟ^(guò)以后,會(huì)轉(zhuǎn)給終審人員進(jìn)行審批,不通過(guò),流程結(jié)束;通過(guò),流轉(zhuǎn)到下個(gè)業(yè)務(wù)場(chǎng)景。對(duì)于這塊業(yè)務(wù)代碼,之前一代目是一個(gè)叫知了的同事,他擼起袖子就是干,一套if-else干到底。后來(lái),技術(shù)老大CodeReview,點(diǎn)名要求改掉這塊。于是乎,想到用用設(shè)計(jì)模式吧,然后就噼里啪啦一頓改。(當(dāng)然,比較復(fù)雜的情況,還是可以用工作流來(lái)處理這個(gè)場(chǎng)景,當(dāng)時(shí)礙于時(shí)間成本,也就放棄了)。

場(chǎng)景二

上家公司對(duì)接甲方爸爸的時(shí)候,對(duì)方會(huì)調(diào)用我們接口,將數(shù)據(jù)同步過(guò)來(lái)。同樣,我們需要將處理好的數(shù)據(jù),傳給他們。由于雙方傳輸數(shù)據(jù)都是加密傳輸,所以在接受他們數(shù)據(jù)之前,需要對(duì)數(shù)據(jù)進(jìn)行解密,驗(yàn)簽,參數(shù)校驗(yàn)等操作。同樣,我們給他們傳數(shù)據(jù)也需要進(jìn)行加簽,加密操作。

具體案例

話不多說(shuō),對(duì)于場(chǎng)景二,我來(lái)放一些偽代碼,跟大家一起探討下。1、一切從注解開(kāi)始,我這里自定義了一個(gè)注解@Duty?,這個(gè)注解有spring的@Component注解,也就是標(biāo)記了這個(gè)自定義注解的類(lèi),都是交給spring的bean容器去管理。注解中,有兩個(gè)屬性:1.type,定義相同的type類(lèi)型的bean,會(huì)被放到一個(gè)責(zé)任鏈集合中。2.order,同一個(gè)責(zé)任鏈集合中,bean的排序,數(shù)值越小,會(huì)放到鏈路最先的位置,優(yōu)先處理。

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 16:11
* @description
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Service
public @interface Duty {
/**
* 標(biāo)記具體業(yè)務(wù)場(chǎng)景
* @return
*/
String type() default "";

/**
* 排序:數(shù)值越小,排序越前
* @return
*/
int order() default 0;
}

2、定義一個(gè)頂層的抽象接口IHandler,傳入2個(gè)泛型參數(shù),供后續(xù)自定義。

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 15:31
* @description 責(zé)任鏈頂層抽象類(lèi)
*/
public interface IHandler<T, R> {
/**
* 抽象處理類(lèi)
* @param t
* @return
*/
R handle(T t);
}

3、定義一個(gè)責(zé)任鏈bean的管理類(lèi)HandleChainManager,用來(lái)存放不同業(yè)務(wù)下的責(zé)任鏈路集合。在該類(lèi)中,有一個(gè)Map和兩個(gè)方法。

handleMap:這個(gè)map會(huì)存放責(zé)任鏈路中,具體的執(zhí)行類(lèi),key是注解@Duty?中定義的type值,value是標(biāo)記了@Duty注解的bean集合,也就是具體的執(zhí)行類(lèi)集合。

setHandleMap:傳入具體執(zhí)行bean的集合,存放在map中。

executeHandle:從map中找到具體的執(zhí)行bean集合,并依次執(zhí)行。

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 16:00
* @description 責(zé)任鏈管理類(lèi)
*/
public class HandleChainManager {
/**
* 存放責(zé)任鏈路上的具體處理類(lèi)
* k-具體業(yè)務(wù)場(chǎng)景名稱(chēng)
* v-具體業(yè)務(wù)場(chǎng)景下的責(zé)任鏈路集合
*/
private Map<String, List<IHandler>> handleMap;

/**
* 存放系統(tǒng)中責(zé)任鏈具體處理類(lèi)
* @param handlerList
*/
public void setHandleMap(List<IHandler> handlerList){
handleMap = handlerList
.stream()
.sorted(Comparator.comparingInt(h -> AnnotationUtils.findAnnotation(h.getClass(), Duty.class).order()))
.collect(Collectors.groupingBy(handler -> AnnotationUtils.findAnnotation(handler.getClass(), Duty.class).type()));
}

/**
* 執(zhí)行具體業(yè)務(wù)場(chǎng)景中的責(zé)任鏈集合
* @param type 對(duì)應(yīng)@Duty注解中的type,可以定義為具體業(yè)務(wù)場(chǎng)景
* @param t 被執(zhí)行的參數(shù)
*/
public <T, R> R executeHandle(String type, T t){
List<IHandler> handlers = handleMap.get(type);
R r = null;
if (CollectionUtil.isNotEmpty(handlers)) {
for (IHandler<T, R> handler : handlers) {
r = handler.handle(t);
}
}
return r;
}
}

4、定義一個(gè)配置類(lèi)PatternConfiguration?,用于裝配上面的責(zé)任鏈管理器HandleChainManager。

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 15:35
* @description 設(shè)計(jì)模式配置類(lèi)
*/
@Configuration
public class PatternConfiguration {

@Bean
public HandleChainManager handlerChainExecute(List<IHandler> handlers){
HandleChainManager handleChainManager = new HandleChainManager();
handleChainManager.setHandleMap(handlers);
return handleChainManager;
}

}

5、具體的處理類(lèi):SignChainHandler、EncryptionChainHandler、RequestChainHandler?,這里我以SignChainHandler?為例。在具體處理類(lèi)上標(biāo)記自定義注解@Duty?,該類(lèi)會(huì)被注入到bean容器中,實(shí)現(xiàn)IHandler接口,只需關(guān)心自己的handle方法,處理具體的業(yè)務(wù)邏輯。

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 15:31
* @description 加簽類(lèi)
*/
@Duty(type = BusinessConstants.REQUEST, order = 1)
public class SignChainHandler implements IHandler<String, String> {
/**
* 處理加簽邏輯
* @param s
* @return
*/
@Override
public String handle(String s){
// 加簽邏輯
System.out.println("甲方爸爸要求加簽");
return "加簽";
}
}

6、具體怎么調(diào)用?這里我寫(xiě)了個(gè)測(cè)試controller直接調(diào)用,具體如下:

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/9/6 17:32
* @description
*/
@RestController
@Slf4j
public class TestController {

@Resource
private HandleChainManager handleChainManager;

@PostMapping("/send")
public String duty(@RequestBody String requestBody){
String response = handleChainManager.executeHandle(BusinessConstants.REQUEST, requestBody);
return response;
}
}

7、執(zhí)行結(jié)果,會(huì)按照注解中標(biāo)記的order依次執(zhí)行。 

圖片

至此,完工。又可以開(kāi)心的擼代碼了,然后在具體的執(zhí)行類(lèi)中,又是一頓if-else。。。

四、源碼中運(yùn)用

4.1Mybatis源碼中的運(yùn)用

Mybatis中的緩存接口Cache,cache作為一個(gè)緩存接口,最主要的功能就是添加和獲取緩存的功能,作為接口它有11個(gè)實(shí)現(xiàn)類(lèi),分別實(shí)現(xiàn)不同的功能,下面是接口源碼和實(shí)現(xiàn)類(lèi)。

package org.apache.ibatis.cache;

import java.util.concurrent.locks.ReadWriteLock;

public interface Cache {
String getId();

void putObject(Object var1, Object var2);

Object getObject(Object var1);

Object removeObject(Object var1);

void clear();

int getSize();

default ReadWriteLock getReadWriteLock(){
return null;
}
}

圖片

下面,我們來(lái)看下其中一個(gè)子類(lèi)LoggingCache的源碼。主要看他的putObject方法和getObject方法,它在方法中直接傳給下一個(gè)實(shí)現(xiàn)去執(zhí)行。這個(gè)實(shí)現(xiàn)類(lèi)其實(shí)是為了在獲取緩存的時(shí)候打印緩存的命中率的。

public class LoggingCache implements Cache {
private final Log log;
private final Cache delegate;
protected int requests = 0;
protected int hits = 0;

public LoggingCache(Cache delegate){
this.delegate = delegate;
this.log = LogFactory.getLog(this.getId());
}

// ...
public void putObject(Object key, Object object){
this.delegate.putObject(key, object);
}

public Object getObject(Object key){
++this.requests;
Object value = this.delegate.getObject(key);
if (value != null) {
++this.hits;
}

if (this.log.isDebugEnabled()) {
this.log.debug("Cache Hit Ratio [" + this.getId() + "]: " + this.getHitRatio());
}

return value;
}
// ...
}

最后,經(jīng)過(guò)Cache?接口各種實(shí)現(xiàn)類(lèi)的處理,最終會(huì)到達(dá)PerpetualCache這個(gè)實(shí)現(xiàn)類(lèi)。與之前的處理類(lèi)不同的是,這個(gè)類(lèi)中有一個(gè)map,在map中做存取,也就是說(shuō),最終緩存還是會(huì)保存在map中的。

public class PerpetualCache implements Cache {
private final String id;
private final Map<Object, Object> cache = new HashMap();

public PerpetualCache(String id){
this.id = id;
}

// ...

public void putObject(Object key, Object value){
this.cache.put(key, value);
}

public Object getObject(Object key){
return this.cache.get(key);
}
// ...

}

4.2spring源碼中的運(yùn)用

4.2.1DispatcherServlet類(lèi)

DispatcherServlet 核心方法 doDispatch。HandlerExecutionChain只是維護(hù)HandlerInterceptor的集合,可以向其中注冊(cè)相應(yīng)的攔截器,本身不直接處理請(qǐng)求,將請(qǐng)求分配給責(zé)任鏈上注冊(cè)處理器執(zhí)行,降低職責(zé)鏈本身與處理邏輯之間的耦合程度。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler.
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
applyDefaultViewName(processedRequest, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
catch (Throwable err) {
// As of 4.3, we're processing Errors thrown from handler methods as well,
// making them available for @ExceptionHandler methods and other scenarios.
dispatchException = new NestedServletException("Handler dispatch failed", err);
}
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
catch (Exception ex) {
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
}
catch (Throwable err) {
triggerAfterCompletion(processedRequest, response, mappedHandler,
new NestedServletException("Handler processing failed", err));
}
finally {
if (asyncManager.isConcurrentHandlingStarted()) {
// Instead of postHandle and afterCompletion
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
}
else {
// Clean up any resources used by a multipart request.
if (multipartRequestParsed) {
cleanupMultipart(processedRequest);
}
}
}
}

4.2.2HandlerExecutionChain類(lèi)

這里分析的幾個(gè)方法,都是從DispatcherServlet類(lèi)的doDispatch方法中請(qǐng)求的。

  • 獲取攔截器,執(zhí)行preHandle方法
boolean applyPreHandle(HttpServletRequest request, 
HttpServletResponse response) throws Exception {
HandlerInterceptor[] interceptors = this.getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = 0; i < interceptors.length; this.interceptorIndex = i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(request, response, this.handler)) {
this.triggerAfterCompletion(request, response, (Exception)null);
return false;
}
}
}
return true;
}

在applyPreHandle方法中,執(zhí)行triggerAfterCompletion方法

void triggerAfterCompletion(HttpServletRequest request, 
HttpServletResponse response, Exception ex) throws Exception {
HandlerInterceptor[] interceptors = this.getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = this.interceptorIndex; i >= 0; --i) {
HandlerInterceptor interceptor = interceptors[i];
try {
interceptor.afterCompletion(request, response, this.handler, ex);
} catch (Throwable var8) {
logger.error("HandlerInterceptor.afterCompletion threw exception", var8);
}
}
}
}

獲取攔截器,執(zhí)行applyPostHandle方法

void applyPostHandle(HttpServletRequest request, 
HttpServletResponse response, ModelAndView mv)
throws Exception {
HandlerInterceptor[] interceptors = this.getInterceptors();
if (!ObjectUtils.isEmpty(interceptors)) {
for(int i = interceptors.length - 1; i >= 0; --i) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(request, response, this.handler, mv);
}
}
}

五、總結(jié)

5.1 優(yōu)點(diǎn)

  • 將請(qǐng)求與處理解耦。
  • 請(qǐng)求處理者(節(jié)點(diǎn)對(duì)象)只需要關(guān)注自己感興趣的請(qǐng)求進(jìn)行處理即可,對(duì)于不感興趣的請(qǐng)求,轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn)。
  • 具備鏈?zhǔn)絺鬟f處理請(qǐng)求功能,請(qǐng)求發(fā)送者無(wú)需知曉鏈路結(jié)構(gòu),只需等待請(qǐng)求處理結(jié)果。
  • 鏈路結(jié)構(gòu)靈活,可以通過(guò)改變鏈路的結(jié)構(gòu)動(dòng)態(tài)的新增或刪減責(zé)任。
  • 易于擴(kuò)展新的請(qǐng)求處理類(lèi)(節(jié)點(diǎn)),符合開(kāi)閉原則。

5.2 缺點(diǎn)

責(zé)任鏈太長(zhǎng)或者處理時(shí)間過(guò)長(zhǎng),會(huì)影響整體性能。

如果節(jié)點(diǎn)對(duì)象存在循環(huán)引用時(shí),會(huì)造成死循環(huán),導(dǎo)致系統(tǒng)崩潰。

六、參考源碼

?編程文檔: https://gitee.com/cicadasmile/butte-java-note

應(yīng)用倉(cāng)庫(kù): https://gitee.com/cicadasmile/butte-flyer-parent

責(zé)任編輯:武曉燕 來(lái)源: 知了一笑
相關(guān)推薦

2022-11-26 00:00:06

裝飾者模式Component

2023-05-15 08:38:58

模板方法模式

2018-06-25 09:32:44

2021-04-28 08:35:52

區(qū)塊鏈技術(shù)開(kāi)發(fā)

2022-07-28 10:39:31

工業(yè)4.0供應(yīng)鏈

2018-06-07 13:17:12

契約測(cè)試單元測(cè)試API測(cè)試

2022-09-26 08:03:25

VMware虛擬機(jī)

2023-12-14 11:35:32

.NET泄露模式

2023-02-09 10:39:15

gRPC通信模式

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2020-08-12 08:34:16

開(kāi)發(fā)安全We

2022-10-08 11:33:56

邊緣計(jì)算云計(jì)算

2020-06-28 09:30:37

Linux內(nèi)存操作系統(tǒng)

2022-03-08 16:10:38

Redis事務(wù)機(jī)制

2022-03-29 09:56:21

游戲版本運(yùn)營(yíng)

2020-09-08 06:54:29

Java Gradle語(yǔ)言

2019-12-17 10:06:18

CDMA高通4G

2021-01-01 09:01:05

前端組件化設(shè)計(jì)
點(diǎn)贊
收藏

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

最近日韩中文字幕中文| 欧美性猛交xxxx偷拍洗澡| 国产精品稀缺呦系列在线| 26uuu成人网| 久久中文字幕一区二区| 亚洲一区二区视频| 欧美日韩一区二区视频在线 | 日韩国产一区| 日韩午夜激情免费电影| 久久精品.com| www视频在线免费观看| 成人性色生活片| 国产精品视频一| 亚洲国产综合久久| 97久久视频| 亚洲精品之草原avav久久| 可以看污的网站| 日本在线影院| 亚洲激情校园春色| 日本不卡在线观看| 亚洲精品久久久久久动漫器材一区| 免费日韩精品中文字幕视频在线| 久久久国产成人精品| 免费看黄色的视频| 丁香婷婷综合色啪| 亚洲国内高清视频| 亚洲天堂网2018| 亚洲优女在线| 亚洲国产一区二区在线播放| 视频一区国产精品| 天堂中文字幕在线| 成人性生交大片免费| 成人乱色短篇合集| 精品国产www| 免费在线亚洲| 国外成人免费在线播放| 国产精品视频一区二区三| 欧美精品一区二区三区精品| 亚洲电影免费观看高清完整版在线观看 | 国产精国产精品| 亚洲 欧美 成人| 亚洲黄色大片| 久久久久久av| 久久久久久久国产精品毛片| 天天综合亚洲| 中文字幕日韩欧美在线| 91网站免费视频| 一区二区三区日本久久久| 亚洲第一页在线| 小毛片在线观看| 国产伦乱精品| 亚洲国产一区二区三区四区| xxx中文字幕| 精品中文视频| 日韩写真欧美这视频| 1314成人网| 中文字幕视频精品一区二区三区| 日韩一区二区在线播放| wwwww在线观看| 96sao在线精品免费视频| 欧美大片顶级少妇| 国产69视频在线观看| 超碰成人97| 日韩av综合中文字幕| 捆绑凌虐一区二区三区| 亚洲瘦老头同性70tv| 亚洲欧美日韩网| 调教驯服丰满美艳麻麻在线视频| 国产欧美日韩一区二区三区四区| 在线成人免费网站| 欧美三级黄色大片| 精品99视频| 欧美夜福利tv在线| 一级久久久久久| 韩国av一区二区三区在线观看| 91久久久在线| 亚洲欧美黄色片| 91网上在线视频| 视频一区视频二区视频三区视频四区国产 | 三级影片在线看| 亚洲人成久久| 国产精品扒开腿做爽爽爽视频 | 亚洲国产成人精品电影| 中文字幕一区二区久久人妻网站 | 国产视频久久网| 91导航在线观看| 欧美在线播放| 2019中文字幕在线观看| 中文字幕a级片| 国产91精品欧美| 青青成人在线| 黄色网在线看| 日韩欧美国产一区二区| 在线观看日本一区二区| 高清日韩欧美| 色偷偷av一区二区三区乱| 久久免费公开视频| 日韩精品一二三四| 国产精品国产精品| 国产69久久| 亚洲成人7777| www.桃色.com| 精品久久精品| 欧美激情中文网| 中文字幕一区2区3区| 成人小视频免费观看| 亚洲.欧美.日本.国产综合在线| 亚洲综合影视| 欧美无砖专区一中文字| 国产一卡二卡三卡四卡| 99久久精品网站| 日本精品视频在线| 国产高清在线免费| 国产精品天干天干在线综合| 欧美乱大交xxxxx潮喷l头像| 日本.亚洲电影| 亚洲国产欧美在线成人app | 亚洲三级黄色片| 亚洲女同ⅹxx女同tv| 欧美少妇性生活视频| 成人福利一区| 久久天天躁狠狠躁夜夜躁2014| 97人妻一区二区精品视频| 成人激情校园春色| 做爰高潮hd色即是空| 精品视频一区二区三区四区五区| 亚洲精品97久久| 国产探花在线播放| 国内精品视频666| 亚洲成人第一| 日韩精品视频免费看| 日本亚洲最大的色成网站www| 国产一区二区黄色| 亚洲夜夜综合| 欧美一区日本一区韩国一区| 欧美激情久久久久久久| 久久亚洲欧美| 欧美精品七区| 综合日韩av| 精品一区二区三区电影| 日韩黄色a级片| 成人黄色网址在线观看| 日本阿v视频在线观看| 国产精品亚洲四区在线观看| 日日狠狠久久偷偷四色综合免费| 婷婷激情五月综合| 国产情人综合久久777777| 97在线播放视频| 日韩高清电影免费| 欧美一区二区三区…… | 中文字幕亚洲精品| 欧美 亚洲 另类 激情 另类| 久久精品一区二区三区不卡| av免费中文字幕| 国产一区二区三区探花| 国产精品久久久久9999| 91短视频版在线观看www免费| 91高清视频在线| 蜜桃av乱码一区二区三区| 日本不卡一区二区| 在线看视频不卡| 欧美午夜在线播放| 久久久亚洲国产| 亚洲 另类 春色 国产| 色综合天天综合在线视频| 亚洲精品成人无码| 美女精品自拍一二三四| 天天成人综合网| 综合中文字幕| 91a在线视频| 狠狠色伊人亚洲综合网站l| 欧美性高清videossexo| 97精品在线播放| 国产福利一区二区三区在线视频| 亚洲国产精品无码观看久久| 日韩美女国产精品| 国产精品私拍pans大尺度在线| 国产美女性感在线观看懂色av| 欧美精品高清视频| 国产一级一片免费播放放a| 91免费观看视频在线| 国产精品视频黄色| 欧美午夜电影在线观看| 久久影视中文粉嫩av| 国产激情久久| 欧美激情精品久久久久久大尺度| 天堂在线一二区| 欧美挠脚心视频网站| 亚洲精品视频在线观看免费视频| 国产亚洲精品久| 欧美高清精品一区二区| 香蕉久久夜色精品| 欧美xxxx吸乳| 女厕嘘嘘一区二区在线播放 | 亚洲国产经典视频| 亚洲欧洲国产视频| 天堂成人国产精品一区| 青青青在线观看视频| 免费看成人哺乳视频网站| 91网站在线看| 超碰国产一区| 欧美精品第一页在线播放| 岛国在线视频| 亚洲黄色www网站| 国产精品乱码一区二区| 欧美午夜女人视频在线| 免费在线观看一级片| 国产清纯白嫩初高生在线观看91| 麻豆短视频在线观看| 久久电影国产免费久久电影| 国产视频一视频二| 中文视频一区| 色爱区成人综合网| 日韩欧美天堂| caoporen国产精品| 亚洲一区有码| 国产精品夫妻激情| 欧美日韩国产观看视频| 欧美国产中文字幕| 麻豆免费在线视频| 亚洲欧美日韩国产成人| 高h放荡受浪受bl| 日韩一区二区免费视频| 波多野结衣网站| 欧美性猛交xxxx久久久| 日本在线免费观看| 亚洲激情在线播放| 国产成人综合在线视频| 中文字幕亚洲一区二区va在线| 国产伦精品一区二区三区妓女| 国产成人亚洲精品青草天美 | 成人aa视频在线观看| 亚洲欧美一区二区三区不卡| 久久国产精品露脸对白| 91激情视频在线| 视频一区二区三区入口| 97成人在线观看视频| 亚洲麻豆av| 黄色一级片在线看| 99精品视频免费全部在线| 国产在线视频在线| 欧美天天视频| 精品一二三四五区| 最新日韩在线| 男人用嘴添女人下身免费视频| 欧美日韩专区| 日韩欧美精品免费| 亚洲国产网站| 久久久久久久久久久视频| 亚洲国产一区二区精品专区| 成人黄色av片| 国产美女精品| 999在线免费视频| 日韩黄色片在线观看| 日韩中文字幕组| 青青草原综合久久大伊人精品优势 | 欧美日韩精品一二三区| 一区二区 亚洲| 7777精品伊人久久久大香线蕉完整版 | 国产伦精品一区二区三区视频孕妇| 国产精品久一| 岛国一区二区三区高清视频| 好吊妞视频这里有精品 | 国产精品视频公开费视频| 99热播精品免费| 91久久久久久国产精品| 成人av动漫| 欧洲在线视频一区| 国产精品久久久久久久久妇女 | 99热精品在线观看| 丁香啪啪综合成人亚洲| 麻豆成人在线观看| 国产ts在线观看| 久久青草国产手机看片福利盒子| 蜜桃久久精品成人无码av| 中文字幕日韩精品一区 | 欧美日韩国产综合网| 亚洲熟妇无码另类久久久| 奶水喷射视频一区| 91精品999| 99视频一区二区三区| 欧美黄色激情视频| 一区二区三区中文在线| 久久国产视频播放| 欧美精选在线播放| 蜜桃视频久久一区免费观看入口| 亚洲人成电影网站色…| 国产素人视频在线观看| 4438全国成人免费| 欧美xxxx性| 九九九九精品| 国产精品国内免费一区二区三区| 国产日本在线播放| 美女诱惑一区二区| 熟妇人妻久久中文字幕| 国产精品久久久爽爽爽麻豆色哟哟| 国产一级片免费| 欧美三级电影精品| 亚洲日本在线播放| 色综合久久精品亚洲国产| 欧美不卡高清一区二区三区| 91久久大香伊蕉在人线| 精品国产一区二区三区香蕉沈先生| 特级西西444| 日本系列欧美系列| 北京富婆泄欲对白| 日韩一区中文字幕| 国产熟妇一区二区三区四区| 亚洲精品在线电影| 欧美成年黄网站色视频| 992tv成人免费视频| 精品视频国内| 亚洲欧洲日本国产| 老司机精品久久| 国产69视频在线观看| 亚洲欧美日韩国产中文在线| 精品一区二三区| 日韩精品福利在线| 成人性生交大片免费看在线播放| 91精品在线观| 久久中文字幕av| 99草草国产熟女视频在线| 99久久久精品免费观看国产蜜| 天堂网avav| 欧美日韩电影在线播放| 国产高清免费在线播放| 清纯唯美日韩制服另类| 91在线一区| 欧美这里只有精品| 国产乱码字幕精品高清av| 欧美一级特黄高清视频| 在线这里只有精品| 九一国产在线| 日本免费久久高清视频| 五月天亚洲色图| 91国视频在线| 久久综合一区二区| 国产成人精品一区二三区| 日韩av中文字幕在线播放| 麻豆蜜桃在线观看| 欧美成人蜜桃| 老鸭窝毛片一区二区三区 | 三级小说欧洲区亚洲区| 无码人妻丰满熟妇区96| av资源网一区| 西西44rtwww国产精品| 精品亚洲一区二区三区在线播放 | 国产精品实拍| 91青草视频久久| 午夜亚洲福利| 白嫩情侣偷拍呻吟刺激| 精品国产乱码久久久久酒店 | 中文字幕日韩国产| 播播国产欧美激情| 欧美中文高清| 久久99中文字幕| 91麻豆国产福利精品| 国产中文字幕视频| 中文字幕亚洲一区| 国产精品成人**免费视频| 日本久久久网站| av日韩在线网站| 亚洲视频 欧美视频| 中文字幕久精品免费视频| 999精品视频在线观看| 日韩视频一二三| 91在线云播放| 欧美性受xxx黑人xyx性爽| 久久精品视频在线播放| 91午夜精品| 久久久久久香蕉| 亚洲码国产岛国毛片在线| 黄色av网址在线| 国产成人精品日本亚洲| 亚洲草久电影| 欧美大喷水吹潮合集在线观看| 91久久一区二区| huan性巨大欧美| 老司机精品福利在线观看| 久久精品国内一区二区三区| 久久国产精品波多野结衣| 亚洲欧美在线磁力| 高清一区二区三区av| 日韩a∨精品日韩在线观看| 国产精品三级电影| 亚洲第九十九页| 国产精品久久久久7777婷婷| 欧美在线91| 手机看片福利视频| 精品久久一区二区三区| 欧美成人app| 国产一二三区在线播放| 欧美国产激情二区三区| 天天干视频在线| 成人a视频在线观看| 一本综合久久| 国产精品国产精品88| 亚洲天天在线日亚洲洲精| 亚洲综合网狠久久| 久久黄色片网站|