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

設計模式系列—解釋器模式

開發 前端
本篇和大家一起來學習解釋器模式相關內容。

本篇和大家一起來學習解釋器模式相關內容。

 模式定義

給分析對象定義一個語言,并定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的實例。這種模式實現了文法表達式處理的接口,該接口解釋一個特定的上下文。

這里提到的文法和句子的概念同編譯原理中的描述相同,“文法”指語言的語法規則,而“句子”是語言集中的元素。例如,漢語中的句子有很多,“我是中國人”是其中的一個句子,可以用一棵語法樹來直觀地描述語言中的句子。

模式的結構和實現

解釋器模式常用于對簡單語言的編譯或分析實例中,為了掌握好它的結構與實現,必須先了解編譯原理中的“文法、句子、語法樹”等相關概念。

文法

文法是用于描述語言的語法結構的形式規則。沒有規矩不成方圓,例如,有些人認為完美愛情的準則是“相互吸引、感情專一、任何一方都沒有戀愛經歷”,雖然最后一條準則較苛刻,但任何事情都要有規則,語言也一樣,不管它是機器語言還是自然語言,都有它自己的文法規則。例如,中文中的“句子”的文法如下。

  • 〈句子〉::=〈主語〉〈謂語〉〈賓語〉
  • 〈主語〉::=〈代詞〉|〈名詞〉
  • 〈謂語〉::=〈動詞〉
  • 〈賓語〉::=〈代詞〉|〈名詞〉
  • 〈代詞〉你|我|他
  • 〈名詞〉7大學生I筱霞I英語
  • 〈動詞〉::=是|學習

注:這里的符號“::=”表示“定義為”的意思,用“〈”和“〉”括住的是非終結符,沒有括住的是終結符。

句子

句子是語言的基本單位,是語言集中的一個元素,它由終結符構成,能由“文法”推導出。例如,上述文法可以推出“我是大學生”,所以它是句子。

語法樹

語法樹是句子結構的一種樹型表示,它代表了句子的推導結果,它有利于理解句子語法結構的層次。下圖所示是“我是大學生”的語法樹。

解釋器模式的結構與組合模式相似,不過其包含的組成元素比組合模式多,而且組合模式是對象結構型模式,而解釋器模式是類行為型模式。

模式的實現 

解釋器模式實現的關鍵是定義文法規則、設計終結符類與非終結符類、畫出結構圖,必要時構建語法樹,其代碼結構如下:

  1. package com.niuh.designpattern.interpreter.v1; 
  2.  
  3. /** 
  4.  * <p> 
  5.  * 解釋器模式 
  6.  * </p> 
  7.  */ 
  8. public class InterpreterPattern { 
  9.  
  10. //抽象表達式類 
  11. interface AbstractExpression { 
  12.     public Object interpret(String info);    //解釋方法 
  13.  
  14. //終結符表達式類 
  15. class TerminalExpression implements AbstractExpression { 
  16.     public Object interpret(String info) { 
  17.         //對終結符表達式的處理 
  18.         return null
  19.     } 
  20.  
  21. //非終結符表達式類 
  22. class NonterminalExpression implements AbstractExpression { 
  23.     private AbstractExpression exp1; 
  24.     private AbstractExpression exp2; 
  25.  
  26.     public Object interpret(String info) { 
  27.         //非對終結符表達式的處理 
  28.         return null
  29.     } 
  30.  
  31. //環境類 
  32. class Context { 
  33.     private AbstractExpression exp; 
  34.  
  35.     public Context() { 
  36.         //數據初始化 
  37.     } 
  38.  
  39.     public void operation(String info) { 
  40.         //調用相關表達式類的解釋方法 
  41.     } 

解決的問題

對于一些固定文法構建一個解釋句子的解釋器。 

模式組成

實例說明

實例概況

用解釋器模式設計一個北京公交車卡的讀卡器程序。

說明:假如北京公交車讀卡器可以判斷乘客的身份,如果是“海淀區”或者“朝陽區”的“老人” “婦女”“兒童”就可以免費乘車,其他人員乘車一次扣 2 元。

分析:本實例用“解釋器模式”設計比較適合,首先設計其文法規則如下。

  1. <expression> ::= <city>的<person> 
  2. <city> ::= 海淀區|朝陽區 
  3. <person> ::= 老人|婦女|兒童 

然后,根據文法規則按以下步驟設計公交車卡的讀卡器程序的類圖。

使用步驟

步驟1:定義一個抽象表達式(Expression)接口,它包含了解釋方法 interpret(String info)。

  1. //抽象表達式類 
  2. interface Expression { 
  3.     public boolean interpret(String info); 

步驟2:定義一個終結符表達式(Terminal Expression)類,它用集合(Set)類來保存滿足條件的城市或人,并實現抽象表達式接口中的解釋方法 interpret(Stringinfo),用來判斷被分析的字符串是否是集合中的終結符。

  1. class TerminalExpression implements Expression { 
  2.     private Set<String> set = new HashSet<String>(); 
  3.  
  4.     public TerminalExpression(String[] data) { 
  5.         for (int i = 0; i < data.length; i++) { 
  6.             set.add(data[i]); 
  7.         } 
  8.     } 
  9.  
  10.     public boolean interpret(String info) { 
  11.         if (set.contains(info)) { 
  12.             return true
  13.         } 
  14.         return false
  15.     } 

步驟3:定義一個非終結符表達式(AndExpressicm)類,它也是抽象表達式的子類,它包含滿足條件的城市的終結符表達式對象和滿足條件的人員的終結符表達式對象,并實現 interpret(String info) 方法,用來判斷被分析的字符串是否是滿足條件的城市中的滿足條件的人員。

  1. class AndExpression implements Expression { 
  2.     private Expression city = null
  3.     private Expression person = null
  4.  
  5.     public AndExpression(Expression city, Expression person) { 
  6.         this.city = city; 
  7.         this.person = person; 
  8.     } 
  9.  
  10.     public boolean interpret(String info) { 
  11.         String s[] = info.split("的"); 
  12.         return city.interpret(s[0]) && person.interpret(s[1]); 
  13.     } 

步驟4:定義一個環境(Context)類,它包含解釋器需要的數據,完成對終結符表達式的初始化,并定義一個方法 freeRide(String info) 調用表達式對象的解釋方法來對被分析的字符串進行解釋。

  1. class Context { 
  2.     private String[] citys = {"海淀區""朝陽區"}; 
  3.     private String[] persons = {"老人""婦女""兒童"}; 
  4.     private Expression cityPerson; 
  5.  
  6.     public Context() { 
  7.         Expression city = new TerminalExpression(citys); 
  8.         Expression person = new TerminalExpression(persons); 
  9.         cityPerson = new AndExpression(city, person); 
  10.     } 
  11.  
  12.     public void freeRide(String info) { 
  13.         boolean ok = cityPerson.interpret(info); 
  14.         if (ok) { 
  15.             System.out.println("您是" + info + ",您本次乘車免費!"); 
  16.         } else { 
  17.             System.out.println(info + ",您不是免費人員,本次乘車扣費2元!"); 
  18.         } 
  19.     } 

步驟5:客戶端測試

  1. public class InterpreterPattern { 
  2.     public static void main(String[] args) { 
  3.         Context bus = new Context(); 
  4.         bus.freeRide("海淀區的老人"); 
  5.         bus.freeRide("海淀區的年輕人"); 
  6.         bus.freeRide("朝陽區的婦女"); 
  7.         bus.freeRide("朝陽區的兒童"); 
  8.         bus.freeRide("南京的年輕人"); 
  9.     } 

輸出結果

  • 您是海淀區的老人,您本次乘車免費!
  • 海淀區的年輕人,您不是免費人員,本次乘車扣費2元!
  • 您是朝陽區的婦女,您本次乘車免費!
  • 您是朝陽區的兒童,您本次乘車免費!
  • 南京的年輕人,您不是免費人員,本次乘車扣費2元!

優點

解釋器模式是一種類行為型模式,其主要優點如下。

  1. 擴展性好。由于在解釋器模式中使用類來表示語言的文法規則,因此可以通過繼承等機制來改變或擴展文法。
  2. 容易實現。在語法樹中的每個表達式節點類都是相似的,所以實現其文法較為容易。

缺點

  1. 執行效率較低。解釋器模式中通常使用大量的循環和遞歸調用,當要解釋的句子較復雜時,其運行速度很慢,且代碼的調試過程也比較麻煩。
  2. 會引起類膨脹。解釋器模式中的每條規則至少需要定義一個類,當包含的文法規則很多時,類的個數將急劇增加,導致系統難以管理與維護。
  3. 可應用的場景比較少。在軟件開發中,需要定義語言文法的應用實例非常少,所以這種模式很少被使用到。

應用場景

  1. 當語言的文法較為簡單,且執行效率不是關鍵問題時。
  2. 當問題重復出現,且可以用一種簡單的語言來進行表達時。
  3. 當一個語言需要解釋執行,并且語言中的句子可以表示為一個抽象語法樹的時候,如 XML 文檔解釋。

模式的擴展

在項目開發中,如果要對數據表達式進行分析與計算,無須再用解釋器模式進行設計了,Java 提供了以下強大的數學公式解析器:Expression4J、MESP(Math Expression String Parser) 和 Jep 等,它們可以解釋一些復雜的文法,功能強大,使用簡單。

現在以 Jep 為例來介紹該工具包的使用方法。Jep 是 Java expression parser 的簡稱,即 Java 表達式分析器,它是一個用來轉換和計算數學表達式的 Java 庫。通過這個程序庫,用戶可以以字符串的形式輸入一個任意的公式,然后快速地計算出其結果。而且 Jep 支持用戶自定義變量、常量和函數,它包括許多常用的數學函數和常量。 

使用前先配置依賴包:

  1. <!-- https://mvnrepository.com/artifact/jep/jep --> 
  2. <dependency> 
  3.     <groupId>jep</groupId> 
  4.     <artifactId>jep</artifactId> 
  5.     <version>2.24</version> 
  6. </dependency> 

下面來看一個案例:

  1. package com.niuh.designpattern.interpreter.v3; 
  2.  
  3.  
  4. import org.nfunk.jep.JEP; 
  5.  
  6. /** 
  7.  * <p> 
  8.  * JepDemo 
  9.  * </p> 
  10.  */ 
  11. public class JepDemo { 
  12.  
  13.     public static void main(String[] args) { 
  14.         JEP jep = new JEP(); //一個數學表達式 
  15.         String exp = "((a+b)*(c+b))/(c+a)/b"; //給變量賦值 
  16.         jep.addVariable("a", 10); 
  17.         jep.addVariable("b", 10); 
  18.         jep.addVariable("c", 10); 
  19.         try { //執行 
  20.             jep.parseExpression(exp); 
  21.             Object result = jep.getValueAsObject(); 
  22.             System.out.println("計算結果: " + result); 
  23.         } catch (Throwable e) { 
  24.             System.out.println("An error occured: " + e.getMessage()); 
  25.         } 
  26.  
  27.     } 

程序運行結果如下:

  • 計算結果: 2.0

源碼中的應用

SpelExpressionParser中解釋器模式應用分析

類圖分析

在下面的類圖中,Expression是一個接口,相當于我們解釋器模式中的非終結符表達式,而ExpressionParser相當于終結符表達式。根據不同的Parser對象,返回不同的Expression對象。

部分源碼分析 

Expression接口

  1. //抽象的非終結符表達式 
  2. public interface Expression { 
  3.  Object getValue() throws EvaluationException; 
  4.   
  5.  Object getValue(Object rootObject) throws EvaluationException; 

SpelExpression類

  1. //具體的非終結符表達式 
  2. public class SpelExpression implements Expression { 
  3.  @Override 
  4.  public Object getValue() throws EvaluationException { 
  5.   Object result; 
  6.   if (this.compiledAst != null) { 
  7.    try { 
  8.     TypedValue contextRoot = evaluationContext == null ? null : evaluationContext.getRootObject(); 
  9.     return this.compiledAst.getValue(contextRoot == null ? null : contextRoot.getValue(), evaluationContext); 
  10.    } 
  11.    catch (Throwable ex) { 
  12.     // If running in mixed mode, revert to interpreted 
  13.     if (this.configuration.getCompilerMode() == SpelCompilerMode.MIXED) { 
  14.      this.interpretedCount = 0; 
  15.      this.compiledAst = null
  16.     } 
  17.     else { 
  18.      // Running in SpelCompilerMode.immediate mode - propagate exception to caller 
  19.      throw new SpelEvaluationException(ex, SpelMessage.EXCEPTION_RUNNING_COMPILED_EXPRESSION); 
  20.     } 
  21.    } 
  22.   } 
  23.   ExpressionState expressionState = new ExpressionState(getEvaluationContext(), this.configuration); 
  24.   result = this.ast.getValue(expressionState); 
  25.   checkCompile(expressionState); 
  26.   return result; 
  27.  } 

CompositeStringExpression

  1. //具體的非終結符表達式 
  2. public class CompositeStringExpression implements Expression { 
  3.  @Override 
  4.  public String getValue() throws EvaluationException { 
  5.   StringBuilder&nbsp;sb&amp;nbsp;= new StringBuilder(); 
  6.   for (Expression expression : this.expressions) { 
  7.    String value = expression.getValue(String.class); 
  8.    if (value != null) { 
  9.    &nbsp;sb.append(value); 
  10.    } 
  11.   } 
  12.   return&nbsp;sb.toString(); 
  13.  } 

ExpressionParser接口

  1. public interface ExpressionParser { 
  2.  //解析表達式 
  3.  Expression parseExpression(String expressionString) throws ParseException; 
  4.  Expression parseExpression(String expressionString, ParserContext context) throws ParseException; 

TemplateAwareExpressionParser類

  1. public abstract class TemplateAwareExpressionParser implements ExpressionParser { 
  2.  @Override 
  3.  public Expression parseExpression(String expressionString) throws ParseException { 
  4.   return parseExpression(expressionString, NON_TEMPLATE_PARSER_CONTEXT); 
  5.  } 
  6.  //根據不同的parser返回不同的Expression對象 
  7.  @Override 
  8.  public Expression parseExpression(String expressionString, ParserContext context) 
  9.    throws ParseException { 
  10.   if (context == null) { 
  11.    context = NON_TEMPLATE_PARSER_CONTEXT; 
  12.   } 
  13.   if (context.isTemplate()) { 
  14.    return parseTemplate(expressionString, context); 
  15.   } 
  16.   else { 
  17.    return doParseExpression(expressionString, context); 
  18.   } 
  19.  } 
  20.  private Expression parseTemplate(String expressionString, ParserContext context) 
  21.    throws ParseException { 
  22.   if (expressionString.length() == 0) { 
  23.    return new LiteralExpression(""); 
  24.   } 
  25.   Expression[] expressions = parseExpressions(expressionString, context); 
  26.   if (expressions.length == 1) { 
  27.    return expressions[0]; 
  28.   } 
  29.   else { 
  30.    return new CompositeStringExpression(expressionString, expressions); 
  31.   } 
  32.  } 
  33.  //抽象的,由子類去實現 
  34.  protected abstract Expression doParseExpression(String expressionString, 
  35.    ParserContext context) throws ParseException; 

SpelExpressionParser類

  1. public class SpelExpressionParser extends TemplateAwareExpressionParser { 
  2.  @Override 
  3.  protected SpelExpression doParseExpression(String expressionString, ParserContext context) throws ParseException { 
  4.   //這里返回了一個InternalSpelExpressionParser, 
  5.   return new InternalSpelExpressionParser(this.configuration).doParseExpression(expressionString, context); 
  6.  } 

InternalSpelExpressionParser類

  1. class InternalSpelExpressionParser extends TemplateAwareExpressionParser { 
  2.  @Override 
  3.  protected SpelExpression doParseExpression(String expressionString, ParserContext context) throws ParseException { 
  4.   try { 
  5.    this.expressionString = expressionString; 
  6.    Tokenizer tokenizer = new Tokenizer(expressionString); 
  7.    tokenizer.process(); 
  8.    this.tokenStream = tokenizer.getTokens(); 
  9.    this.tokenStreamLength = this.tokenStream.size(); 
  10.    this.tokenStreamPointer = 0; 
  11.    this.constructedNodes.clear(); 
  12.    SpelNodeImpl ast = eatExpression(); 
  13.    if (moreTokens()) { 
  14.     throw new SpelParseException(peekToken().startPos, SpelMessage.MORE_INPUT, toString(nextToken())); 
  15.    } 
  16.    Assert.isTrue(this.constructedNodes.isEmpty()); 
  17.    return new SpelExpression(expressionString, ast, this.configuration); 
  18.   } 
  19.   catch (InternalParseException ex) { 
  20.    throw ex.getCause(); 
  21.   } 
  22.  } 

PS:以上代碼提交在 Github : 

https://github.com/Niuh-Study/niuh-designpatterns.git

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-05-15 08:51:46

解釋器模式定義

2010-04-21 08:38:18

解釋器模式PHP設計模式

2021-06-22 15:27:13

設計模式迭代器模式Java

2022-01-19 08:21:12

設計裝飾器模式

2020-11-03 13:05:18

命令模式

2020-11-04 08:54:54

狀態模式

2020-10-23 09:40:26

設計模式

2022-01-12 13:33:25

工廠模式設計

2020-11-06 09:01:46

迭代器模式

2023-03-03 08:12:07

設計模式語言

2020-10-20 13:33:00

建造者模式

2012-01-13 15:59:07

2021-10-26 00:21:19

設計模式建造者

2021-10-28 19:09:09

模式原型Java

2020-11-05 09:38:07

中介者模式

2020-10-28 11:56:47

橋接模式

2020-10-21 14:29:15

原型模式

2020-10-19 09:28:00

抽象工廠模式

2013-11-26 15:48:53

Android設計模式SDK

2022-01-14 09:22:22

設計模式橋接
點贊
收藏

51CTO技術棧公眾號

久久亚洲免费| a级片免费观看| 色婷婷av一区二区三| 欧美综合视频| 波多野结衣精品在线| 国产性猛交xxxx免费看久久| 青青草综合在线| 青青草av在线播放| 99久久久国产精品免费调教网站| 精品在线免费观看| 精品国产99国产精品| 亚洲欧美日韩国产yyy| 亚洲精品午夜国产va久久成人| 日韩五码电影| 国产日本欧洲亚洲| 欧美自拍大量在线观看| aaa黄色大片| 18网站在线观看| 精品久久久久久久久久久aⅴ| 亚洲成人午夜影院| 不卡视频一区| 男的操女的网站| 9.1麻豆精品| 国产精品久久影院| 国产欧美日韩最新| 正在播放国产对白害羞| 亚洲爱爱视频| 国产精品网曝门| 国产美女精品免费电影| 99成人在线观看| 亚洲午夜剧场| 色婷婷一区二区| 日韩影视精品| 一女二男一黄一片| 国产精品久久久久久麻豆一区软件 | 2019亚洲日韩新视频| 免费欧美一级片| 亚洲电影视频在线| 粉嫩aⅴ一区二区三区四区五区| 美女少妇精品视频| 少妇伦子伦精品无吗| 俺来也官网欧美久久精品| 成人白浆超碰人人人人| 91精品美女在线| 欧美成人精品欧美一级| 都市激情亚洲欧美| 欧美视频一区二区三区…| 久久亚洲国产精品日日av夜夜| www.亚洲黄色| 亚洲尤物精选| 在线看日韩欧美| 中文字幕一区二区三区四| 丁香影院在线| 亚洲久草在线视频| 久久国产精品久久| 中文字幕在线2018| 欧美午夜在线视频| 亚洲品质视频自拍网| 中文字幕线观看| 91福利区在线观看| 国产精品丝袜在线| 日韩欧美在线一区二区| 成人午夜电影在线观看| 国产99精品在线观看| 亚洲综合在线做性| 手机在线看片1024| 女人天堂亚洲aⅴ在线观看| 亚洲精美色品网站| 亚洲激情在线看| 天堂中文在线播放| 亚洲欧美日韩一区| 欧美日韩一区二 | 久久精品国产一区二区三区不卡| 黄色av小说在线观看| 一区二区国产在线观看| 中文字幕日韩欧美在线| 一级黄色电影片| 51av在线| 狠狠综合久久av一区二区小说| 日本午夜精品一区二区| 超碰在线人人干| 不卡一区二区三区四区| 欧美久久电影| 日本不卡视频| 久久久精品黄色| 99国产在线观看| 天天操天天射天天舔| 久久久久久久av麻豆果冻| 乱一区二区三区在线播放| 国产精品秘入口| 99久久综合精品| 亚洲a级在线观看| 国产综合视频在线| 国产日韩精品一区| 久久精品女人的天堂av| 国产黄色在线播放| 亚洲精品视频一区二区| 欧美日本视频在线观看| 女人天堂av在线播放| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 成人免费毛片嘿嘿连载视频…| 欧美精品xxxxbbbb| 91视频免费版污| 小早川怜子影音先锋在线观看| 在线观看一区二区视频| 日韩在线综合网| 久久日本片精品aaaaa国产| 色悠悠久久综合| 亚洲午夜精品一区| 西野翔中文久久精品字幕| 精品国产乱码久久久久久久| 美女脱光内衣内裤| 色婷婷狠狠五月综合天色拍| 中文字幕欧美精品在线| 日韩网红少妇无码视频香港| 久久99精品国产麻豆婷婷| 精品亚洲欧美日韩| 四虎国产精品永远| 粉嫩av一区二区三区| 先锋影音欧美| 在线免费av电影| 国产精品成人网| 国模吧无码一区二区三区| 午夜不卡影院| 日韩欧美一区二区免费| 在线中文字日产幕| 日本熟伦人妇xxxx| 黑色丝袜福利片av久久| 日韩亚洲欧美在线| 免费观看黄网站| 狠狠色狠狠色综合婷婷tag| 亚洲天堂一区二区三区| 日本免费在线播放| 国产精品婷婷| 日韩美女在线播放| 中文字幕 日韩有码| 91在线你懂得| 日韩videos| 亚洲妇女成熟| 日韩电影中文字幕在线| 欧洲美一区二区三区亚洲| 色琪琪久久se色| 精品中文字幕在线观看| 国产一级特黄aaa大片| 韩国成人福利片在线播放| 成人h视频在线观看| 蜜桃视频在线观看免费视频网站www| 色哟哟亚洲精品| 特级西西人体wwwww| 成人在线亚洲| 国产精品一二三视频| 国产大学生校花援交在线播放| 欧美性videos高清精品| 特大黑人巨人吊xxxx| 亚洲日本成人| 国产精品夫妻激情| 国产人妖一区二区| 91免费视频网| 天天干天天操天天干天天操| 好吊日av在线| 精品国产乱码久久久久久老虎| 九九视频免费在线观看| 久久免费黄色| 99国产超薄肉色丝袜交足的后果 | 亚洲高清影院| 久久视频在线视频| 青青国产在线观看| 久久这里只有精品6| 日本xxx免费| 女海盗2成人h版中文字幕| 精品视频1区2区3区| 久久久久久久久久久久国产精品| 国产精品a久久久久| 国产伦精品一区二区三区照片91 | 国产精品久久久久久免费播放| 国产盗摄精品一区二区三区在线| 欧美精品七区| 青青热久免费精品视频在线18| 永久免费精品影视网站| 一区二区三区精| 一区二区在线观看视频| 黄色一级大片在线观看| 亚洲福利影视| 欧美精品www| 国产一区二区三区三州| 一区二区三区成人| 五月天婷婷影视| 欧美日韩亚洲一区三区 | 亚洲一区二区三区欧美| 日本福利片在线| 亚洲视频1区2区| 色综合久久久无码中文字幕波多| 亚洲精品少妇| 亚洲图片在线观看| 国产精品久av福利在线观看| 国产精品xxx视频| 性欧美ⅴideo另类hd| 亚洲欧美成人精品| 国产无码精品视频| 欧美激情一区二区三区全黄| 日本黄色一级网站| 亚洲成人精品| 成人av在线网址| 国产免费拔擦拔擦8x高清在线人| 欧美一区二区三区成人| 国产一区二区在线免费| 男人天堂网在线观看| 一级中文字幕一区二区| a天堂中文字幕| 高清成人在线观看| 色婷婷成人在线| 清纯唯美日韩| 国产嫩草一区二区三区在线观看| 成视频免费观看在线看| 在线播放中文一区| 日韩三级在线观看视频| 久久av资源站| 国产精品久久中文字幕| 美女av一区| 91久久国产婷婷一区二区| 麻豆tv在线| 国产手机视频精品| 一级久久久久久| 国产精品久久久爽爽爽麻豆色哟哟| 免费黄色在线播放| 精品一二三四区| 婷婷丁香激情网| 新狼窝色av性久久久久久| 日本大胆人体视频| 我不卡神马影院| 午夜精品美女久久久久av福利| 美女一区2区| 国产精品初高中精品久久| av中文字幕在线观看第一页| 欧美成人午夜免费视在线看片| av色图一区| 一区二区三区在线播放欧美| 日韩在线免费看| 日韩高清av在线| 婷婷在线观看视频| 一本在线高清不卡dvd| 国产亚洲精品成人| 91在线你懂得| 亚洲黄色免费在线观看| 日本中文在线一区| 熟女视频一区二区三区| 四虎国产精品免费观看| 成人动漫视频在线观看完整版| 亚洲伦理久久| 国产欧美精品va在线观看| 福利精品一区| 国产精品午夜视频| 亚洲人体在线| 91九色蝌蚪成人| 欧美性xxx| 久久99精品视频一区97| 超碰在线观看免费| 久久99久久亚洲国产| 久久av色综合| 2019中文字幕在线免费观看| 亚洲福利影院| 国产精品美女久久| 狠狠躁少妇一区二区三区| 97国产精品久久| 免费黄网站在线| 久久色免费在线视频| 二区在线播放| 国语自产精品视频在线看一大j8| √天堂资源地址在线官网| 在线视频日本亚洲性| 毛片网站在线免费观看| 欧美精品生活片| 高清在线视频不卡| 日韩美女主播视频| 国产精品国产亚洲精品| 国产精品草莓在线免费观看 | 国产精品入口免费视频一| 亚瑟国产精品| 国产一区在线免费观看| 欧州一区二区| 亚洲精品少妇一区二区| 亚洲欧美不卡| 手机在线国产视频| 成人av网站在线| 日本爱爱爱视频| 91香蕉视频在线| 美国美女黄色片| 2020国产精品自拍| 亚洲一区 欧美| 一级中文字幕一区二区| 无码人妻精品一区二区三区不卡| 亚洲一区二区三区四区在线观看 | 亚洲av毛片成人精品| 国产亚洲xxx| 亚洲妇熟xxxx妇色黄| 日韩美女在线观看一区| 亚洲视频精选| 91精品久久久久久久| 亚洲一区二区三区免费| 欧美自拍资源在线| 欧美另类专区| 欧美黄色性生活| 首页综合国产亚洲丝袜| 亚洲综合伊人久久| 久久夜色精品国产噜噜av| 希岛爱理中文字幕| 色婷婷久久久亚洲一区二区三区 | 一区二区日本伦理| 伊人精品在线| 性欧美大战久久久久久久| 美女一区二区三区在线观看| 美女黄色片视频| 成人午夜短视频| av黄色一级片| 99国产精品久久久久久久久久久| jizz18女人高潮| 欧美日韩久久久久| 午夜精品久久久久久久91蜜桃| 亚洲片av在线| 忘忧草在线日韩www影院| 俄罗斯精品一区二区| 久久亚洲国产| 欧美精品无码一区二区三区| 亚洲永久字幕| 中文字幕99页| 亚洲精选视频免费看| 中文字幕在线播放av| 亚洲人成电影网站| 忘忧草在线影院两性视频| 国产精品自拍首页| 欧美日韩亚洲一区三区| 91av免费观看| 亚洲日本青草视频在线怡红院| 中文字幕 自拍偷拍| 亚洲性线免费观看视频成熟| 无码小电影在线观看网站免费| 国产精品一级久久久| 欧美日韩亚洲一区三区| 极品人妻一区二区| 亚洲精品成人悠悠色影视| 国产精品视频a| 久久久999精品| 97久久人人超碰caoprom| 亚洲资源在线看| 一区二区三区在线| 免费国产a级片| 成人精品免费看| 亚洲精品午夜久久久久久久| 欧美不卡一区二区三区四区| 人人九九精品| 欧美影院久久久| 亚洲丁香日韩| 中文字幕av日韩精品| 在线播放亚洲| 天堂www中文在线资源| 亚洲大片在线观看| 天堂a中文在线| 日本欧美在线视频| 欧美在线免费看视频| 黄色一级片免费的| 亚洲激情欧美激情| 亚洲欧美另类综合| 欧美一区二三区| 欧美在线观看视频一区| 国产精品自在自线| 亚洲一区二区在线免费看| 手机在线精品视频| 国产成人一区二区在线| 91麻豆精品激情在线观看最新| 日韩精品一区二区三区丰满| 日韩中文字幕1| 日本人妻一区二区三区| 亚洲va在线va天堂| 国产精品呻吟久久| 欧美—级a级欧美特级ar全黄| 大陆精大陆国产国语精品| 国产精品免费入口| 国产精品家庭影院| 亚洲国产精品久久久久爰性色| 中文字幕日韩在线视频| 高清一区二区| 欧美男女爱爱视频| 国产精品一区二区不卡| 日韩av片在线免费观看| 日韩一区二区三区观看| 精品众筹模特私拍视频| 久久人人九九| 激情成人午夜视频| 毛片视频网站在线观看| 最近的2019中文字幕免费一页| 欧美7777| 一道本在线观看视频| 99国产一区二区三精品乱码| 亚洲天堂网在线观看视频| 亚洲午夜久久久久久久| 高清不卡一区| 人妻精品无码一区二区三区 | 亚洲黄色成人网| 成人午夜在线| 无码人妻丰满熟妇区96|