国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

聊一聊責(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ò)層層傳遞,最終射門。通過(guò)這張圖,可以更好的理解責(zé)任鏈模式。

圖片

二、入門案例

2.1 類圖

圖片

2.2 基礎(chǔ)類介紹

抽象接口RequestHandler

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

void doHandler(String req);
}

抽象類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;
}
}

具體處理類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è)類(若鏈路中還有下個(gè)處理類)
if (next != null) {
next.doHandler(req);
}
}
}

當(dāng)然還有具體的處理類B、C等等,這里不展開(kā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è)自定義注解的類,都是交給spring的bean容器去管理。注解中,有兩個(gè)屬性:1.type,定義相同的type類型的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é)任鏈頂層抽象類
*/
public interface IHandler<T, R> {
/**
* 抽象處理類
* @param t
* @return
*/
R handle(T t);
}

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

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

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

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

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

/**
* 存放系統(tǒng)中責(zé)任鏈具體處理類
* @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è)配置類PatternConfiguration?,用于裝配上面的責(zé)任鏈管理器HandleChainManager。

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

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

}

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

/**
* @author 往事如風(fēng)
* @version 1.0
* @date 2022/10/25 15:31
* @description 加簽類
*/
@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)用?這里我寫了個(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í)行類中,又是一頓if-else。。。

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

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

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

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è)子類LoggingCache的源碼。主要看他的putObject方法和getObject方法,它在方法中直接傳給下一個(gè)實(shí)現(xiàn)去執(zhí)行。這個(gè)實(shí)現(xiàn)類其實(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)類的處理,最終會(huì)到達(dá)PerpetualCache這個(gè)實(shí)現(xiàn)類。與之前的處理類不同的是,這個(gè)類中有一個(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類

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類

這里分析的幾個(gè)方法,都是從DispatcherServlet類的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)求處理類(節(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-02-09 10:39:15

gRPC通信模式

2023-12-14 11:35:32

.NET泄露模式

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2021-01-28 22:31:33

分組密碼算法

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)

2021-01-01 09:01:05

前端組件化設(shè)計(jì)

2020-09-08 06:54:29

Java Gradle語(yǔ)言

2019-12-17 10:06:18

CDMA高通4G

2022-03-29 09:56:21

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

2018-01-10 14:13:04

測(cè)試矩陣API測(cè)試
點(diǎn)贊
收藏

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

91色视频在线导航| 欧美久久久久久久久久久久久| 成人日韩欧美| 97se狠狠狠综合亚洲狠狠| 国产日韩精品视频| 日日夜夜亚洲| 日韩欧美国产综合一区| 日本19禁啪啪吃奶大尺度| 国产91色综合久久免费分享| 国产精品欧美久久| 日韩精品福利一区二区三区| 在线观看国产成人av片| av在线网址观看| 精品久久久久久电影| 免费观看成人网| 国产成人综合亚洲91猫咪| 国产亚洲二区| 四季av一区二区凹凸精品| 久久91精品国产91久久跳| 亚洲欧美韩国| 日韩亚洲欧美高清| 成人精品一区二区三区免费| 亚洲午夜精品在线| 九色在线91| 国产亚洲欧美激情| 成人午夜精品久久久久久久蜜臀| 久久香蕉精品| 国产一级特黄a大片99| 成人短片线上看| 日本视频久久久| jazzjazz国产精品久久| 国产一区二区三区丝袜| f2c人成在线观看免费视频| 欧美日韩不卡一区| www.中文字幕久久久| 一本色道久久加勒比精品| 三上悠亚在线观看二区| 国产精品久久久久aaaa| 日本xxxxxxx免费视频| 99re这里只有精品6| 久久成人福利视频| 成人三级伦理片| 欧美a级免费视频| 国产综合一区二区| 日本黄网站色大片免费观看| 国产一区免费电影| 欧洲精品视频在线| 国产九色精品成人porny| 制服丝袜综合日韩欧美| 久久成人羞羞网站| 亚洲国产一二三精品无码| 国产精品99久久久久久久女警 | 国产视频自拍一区| 国产精品国精产品一二| 日韩精品一区二区三区在线播放| 日本精品在线| 日韩免费观看高清完整版| 三级资源在线| 亚洲欧洲激情在线| www.久久爱.com| 2019国产精品自在线拍国产不卡| 在线亚洲a色| 亚洲自拍小视频免费观看| 国产精品99免费看| 日产精品高清视频免费| 国产在线不卡视频| 狠狠干 狠狠操| 国产精品每日更新在线播放网址| 男女人搞j网站| 欧美日韩国产一区二区| 美女国产在线| 国产亚洲欧美日韩精品| 红杏一区二区三区| 亚洲va久久久噜噜噜| 久久av一区| 成年人网站国产| 亚洲欧美另类小说视频| 国产高清av在线| 精品国产免费视频| 国产精品字幕| 国产精品日韩一区| 美女精品在线| 北条麻妃在线一区| 午夜视频一区在线观看| caopen在线视频| 欧美成人一区在线| 欧美成人一品| 男的插女的下面视频| 亚洲一二三区不卡| 福利写真视频网站在线| 欧美另类极品videosbestfree| 91综合久久一区二区| 亚洲人久久久| 亚洲色图欧美在线| 污视频在线看网站| 欧美亚洲伦理www| 日av在线不卡| 国产美女免费观看| 日韩经典第一页| 欧美日韩一区二区综合| 国产系列第一页| 亚洲一区二区三区在线| 性欧美18~19sex高清播放| 日韩免费在线看| 久久激情五月激情| 佐山爱痴汉视频一区二区三区 | 欧美oldwomenvideos| 亚洲成人自拍| 亚洲一线二线三线视频| 国产网红在线观看| 国产精品激情自拍| 成人一区二区三区在线观看| 污香蕉视频在线观看| 久久亚洲精品小早川怜子66| 极品av少妇一区二区| 嫩草影院在线观看网站成人| 亚洲精品国产精品久久清纯直播 | 成人黄色片在线| 国产成人日日夜夜| 欧美日韩伦理片| 国模精品一区二区三区色天香| 日韩电影一区二区三区四区| 四虎永久在线| 欧美福利小视频| 国产老肥熟一区二区三区| 超碰国产在线| 国产精品999999| 久久久久88色偷偷免费| 超碰99在线| 美女主播视频一区| 欧美午夜性色大片在线观看| 91综合精品国产丝袜长腿久久| 在线观看成人免费| 日韩一区二区三区视频在线观看| 四季av一区二区凹凸精品| 在线观看的毛片| 久久精品色欧美aⅴ一区二区| 久久精品国产网站| 欧美激情二区| 国产精品免费一区二区| 亚洲成人福利片| 九九亚洲视频| 2019中文字幕视频| 久久久久久免费精品| 99久久综合国产精品| а√在线天堂官网| 青青草原亚洲| 日韩欧美在线网站| 香蕉成人久久| 欧美激情视频在线播放| 91入口在线观看| 午夜精品久久久久久久| 蜜桃视频欧美| 国产女主播在线| 国产va免费精品高清在线观看| 欧美激情综合五月色丁香| 国产一区二区| 精品www久久久久奶水| 欧美成人亚洲成人| 国产女主播视频一区二区| 成人在线视频区| 毛片av免费在线观看| 久久影院资源网| 国产午夜亚洲精品理论片色戒 | 毛片毛片毛片毛片毛片毛片| 欧美成人黄色小视频| 2023国产精品| 日韩欧美中文字幕一区二区三区 | 黄色日韩精品| 大地资源中文在线观看免费版 | 国产精品视频一区二区三区综合| 给我免费播放片在线观看| 亚洲色图av在线| 成人免费看的视频| 亚洲欧美一级| www.99.热| 日韩免费黄色av| 91黄色小视频| 久久久国产精品一区二区中文| 在线观看操人| 欧美深夜福利视频| 国内精品400部情侣激情| 亚洲最大成人网4388xx| 国产精品sm| 悠悠资源网亚洲青| 欧美一级黄色影院| 国产欧美日韩专区发布| 91精品黄色片免费大全| 国产suv一区二区三区88区| 亚洲精品a区| 在线看黄的网站| 欧美一区二区视频在线| 亚洲色图偷窥自拍| 国产精品久久久久久久岛一牛影视| 日韩在线第七页| 性网站在线观看| www.四虎成人| 99久久99久久| 国产亚洲精品久久久久动| 亚洲乱码中文字幕|