久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 Drools 规则引擎实现业务逻辑,可调试drl文件

發(fā)布時間:2024/4/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Drools 规则引擎实现业务逻辑,可调试drl文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?http://www.srcsky.com/tech/arts/389.html

代碼下載http://download.csdn.net/detail/zhy011525/2462313

?

  • 使用 Drools 規(guī)則引擎實現(xiàn)業(yè)務邏輯

  • 時間:2010-04-02來源:ibm作者:Ricardo閱讀:0 次字體:[ 大中 小 ]
  •   要求施加在當今軟件產(chǎn)品上的大多數(shù)復雜性是行為和功能方面的,從而導致組件實現(xiàn)具有復雜的業(yè)務邏輯。實現(xiàn) J2EE 或 J2SE 應用程序中業(yè)務邏輯最常見的方法是編寫 Java 代碼來實現(xiàn)需求文檔的規(guī)則和邏輯。在大多數(shù)情況下,該代碼的錯綜復雜性使得維護和更新應用程序的業(yè)務邏輯成為一項令人畏懼的任務,甚至對于經(jīng)驗豐富的開發(fā)人員來說也是如此。任何更改,不管多么簡單,仍然會產(chǎn)生重編譯和重部署成本。

      規(guī)則引擎試圖解決(或者至少降低)應用程序業(yè)務邏輯的開發(fā)和維護中固有的問題和困難。可以將規(guī)則引擎看作實現(xiàn)復雜業(yè)務邏輯的框架。大多數(shù)規(guī)則引擎允許您使用聲明性編程來表達對于某些給定信息或知識有效的結果。您可以專注于已知為真的事實及其結果,也就是應用程序的業(yè)務邏輯。

      有多個規(guī)則引擎可供使用,其中包括商業(yè)和開放源碼選擇。商業(yè)規(guī)則引擎通常允許使用專用的類似英語的語言來表達規(guī)則。其他規(guī)則引擎允許使用腳本語言(比如 Groovy 或 Python)編寫規(guī)則。這篇更新的文章為您介紹 Drools 引擎,并使用示例程序幫助您理解如何使用 Drools 作為 Java 應用程序中業(yè)務邏輯層的一部分。

      更多事情在變化……

      俗話說得好,“惟一不變的是變化。”軟件應用程序的業(yè)務邏輯正是如此。出于以下原因,實現(xiàn)應用程序業(yè)務邏輯的組件可能必須更改:

      在開發(fā)期間或部署后修復代碼缺陷

      應付特殊狀況,即客戶一開始沒有提到要將業(yè)務邏輯考慮在內

      處理客戶已更改的業(yè)務目標

      符合組織對敏捷或迭代開發(fā)過程的使用

      如果存在這些可能性,則迫切需要一個無需太多復雜性就能處理業(yè)務邏輯更改的應用程序,尤其是當更改復雜 if-else 邏輯的開發(fā)人員并不是以前編寫代碼的開發(fā)人員時。

      Drools 是用 Java 語言編寫的開放源碼規(guī)則引擎,使用 Rete 算法對所編寫的規(guī)則求值。Drools 允許使用聲明方式表達業(yè)務邏輯。可以使用非 XML 的本地語言編寫規(guī)則,從而便于學習和理解。并且,還可以將 Java 代碼直接嵌入到規(guī)則文件中,這令 Drools 的學習更加吸引人。Drools 還具有其他優(yōu)點:

      非常活躍的社區(qū)支持

      易用

      快速的執(zhí)行速度

      在 Java 開發(fā)人員中流行

      與 Java Rule Engine API(JSR 94)兼容

      免費

      當前 Drools 版本

      在編寫本文之際,Drools 規(guī)則引擎的最新版本是 4.0.4。這是一個重要更新。雖然現(xiàn)在還存在一些向后兼容性問題,但這個版本的特性讓 Drools 比以前更有吸引力。例如,用于表達規(guī)則的新的本地語言比舊版本使用的 XML 格式更簡單,更優(yōu)雅。這種新語言所需的代碼更少,并且格式易于閱讀。

      另一個值得注意的進步是,新版本提供了用于 Eclipse IDE(Versions 3.2 和 3.3)的一個 Drools 插件。我強烈建議您通過這個插件來使用 Drools。它可以簡化使用 Drools 的項目開發(fā),并且可以提高生產(chǎn)率。例如,該插件會檢查規(guī)則文件是否有語法錯誤,并提供代碼完成功能。它還使您可以調試規(guī)則文件,將調試時間從數(shù)小時減少到幾分鐘。您可以在規(guī)則文件中添加斷點,以便在規(guī)則執(zhí)行期間的特定時刻檢查對象的狀態(tài)。這使您可以獲得關于規(guī)則引擎在特定時刻所處理的知識(knowledge)(在本文的后面您將熟悉這個術語)的信息。

      要解決的問題

      本文展示如何使用 Drools 作為示例 Java 應用程序中業(yè)務邏輯層的一部分。為了理解本文,您應該熟悉使用 Eclipse IDE 開發(fā)和調試 Java 代碼。并且,您還應該熟悉 JUnit 測試框架,并知道如何在 Eclipse 中使用它。

      下列假設為應用程序解決的虛構問題設置了場景:

      名為 XYZ 的公司構建兩種類型的計算機機器:Type1 和 Type2。機器類型按其架構定義。

      XYZ 計算機可以提供多種功能。當前定義了四種功能:DDNS Server、DNS Server、Gateway 和 Router。

      在發(fā)運每臺機器之前,XYZ 在其上執(zhí)行多個測試。

      在每臺機器上執(zhí)行的測試取決于每臺機器的類型和功能。目前,定義了五種測試:Test1、Test2、Test3、Test4 和 Test5。

      當將測試分配給一臺計算機時,也將測試到期日期 分配給該機器。分配給計算機的測試不能晚于該到期日期執(zhí)行。到期日期值取決于分配給機器的測試。

      XYZ 使用可以確定機器類型和功能的內部開發(fā)的軟件應用程序,自動化了執(zhí)行測試時的大部分過程。然后,基于這些屬性,應用程序確定要執(zhí)行的測試及其到期日期。

      目前,為計算機分配測試和測試到期日期的邏輯是該應用程序的已編譯代碼的一部分。包含該邏輯的組件用 Java 語言編寫。

      分配測試和到期日期的邏輯一個月更改多次。當開發(fā)人員需要使用 Java 代碼實現(xiàn)該邏輯時,必須經(jīng)歷一個冗長乏味的過程。

      何時使用規(guī)則引擎

      并非所有應用程序都應使用規(guī)則引擎。如果業(yè)務邏輯代碼包括很多 if-else 語句,則應考慮使用一個規(guī)則引擎。維護復雜的 Boolean 邏輯可能是非常困難的任務,而規(guī)則引擎可以幫助您組織該邏輯。當您可以使用聲明方法而非命令編程語言表達邏輯時,變化引入錯誤的可能性會大大降低。

      如果代碼變化可能導致大量的財政損失,則也應考慮規(guī)則引擎。許多組織在將已編譯代碼部署到托管環(huán)境中時具有嚴格的規(guī)則。例如,如果需要修改 Java 類中的邏輯,在更改進入生產(chǎn)環(huán)境之前,將會經(jīng)歷一個冗長乏味的過程:

      必須重新編譯應用程序代碼。

      在測試中轉環(huán)境中刪除代碼。

      由數(shù)據(jù)質量審核員檢查代碼。

      由托管環(huán)境架構師批準更改。

      計劃代碼部署。

      即使對一行代碼的簡單更改也可能花費組織的幾千美元。如果需要遵循這些嚴格規(guī)則并且發(fā)現(xiàn)您頻繁更改業(yè)務邏輯代碼,則非常有必要考慮使用規(guī)則引擎。

      對客戶的了解也是該決策的一個因素。盡管您使用的是一個簡單的需求集合,只需 Java 代碼中的簡單實現(xiàn),但是您可能從上一個項目得知,您的客戶具有在開發(fā)周期期間甚至部署之后添加和更改業(yè)務邏輯需求的傾向(以及財政和政治資源)。如果從一開始就選擇使用規(guī)則引擎,您可能會過得舒服一些。

      因為在對為計算機分配測試和到期日期的邏輯進行更改時,公司會發(fā)生高額成本,所以 XYZ 主管已經(jīng)要求軟件工程師尋找一種靈活的方法,用最少的代價將對業(yè)務規(guī)則的更改 “推” 至生產(chǎn)環(huán)境。于是 Drools 走上舞臺了。工程師決定,如果它們使用規(guī)則引擎來表達確定哪些測試應該執(zhí)行的規(guī)則,則可以節(jié)省更多時間和精力。他們將只需要更改規(guī)則文件的內容,然后在生產(chǎn)環(huán)境中替換該文件。對于他們來說,這比更改已編譯代碼并在將已編譯代碼部署到生產(chǎn)環(huán)境中時進行由組織強制的冗長過程要簡單省時得多(參閱側欄 何時使用規(guī)則引擎)。

      目前,在為機器分配測試和到期日期時必須遵循以下業(yè)務規(guī)則:

      如果計算機是 Type1,則只能在其上執(zhí)行 Test1、Test2 和 Test5。

      如果計算機是 Type2 且其中一個功能為 DNS Server,則應執(zhí)行 Test4 和 Test5。

      如果計算機是 Type2 且其中一個功能為 DDNS Server,則應執(zhí)行 Test2 和 Test3。

      如果計算機是 Type2 且其中一個功能為 Gateway,則應執(zhí)行 Test3 和 Test4。

      如果計算機是 Type2 且其中一個功能為 Router,則應執(zhí)行 Test1 和 Test3。

      如果 Test1 是要在計算機上執(zhí)行的測試之一,則測試到期日期距離機器的創(chuàng)建日期 3 天。該規(guī)則優(yōu)先于測試到期日期的所有下列規(guī)則。

      如果 Test2 是要在計算機上執(zhí)行的測試之一,則測試到期日期距離機器的創(chuàng)建日期 7 天。該規(guī)則優(yōu)先于測試到期日期的所有下列規(guī)則。

      如果 Test3 是要在計算機上執(zhí)行的測試之一,則測試到期日期距離機器的創(chuàng)建日期 10 天。該規(guī)則優(yōu)先于測試到期日期的所有下列規(guī)則。

      如果 Test4 是要在計算機上執(zhí)行的測試之一,則測試到期日期距離機器的創(chuàng)建日期 12 天。該規(guī)則優(yōu)先于測試到期日期的所有下列規(guī)則。

      如果 Test5 是要在計算機上執(zhí)行的測試之一,則測試到期日期距離機器的創(chuàng)建日期 14 天。

      捕獲為機器分配測試和測試到期日期的上述業(yè)務規(guī)則的當前 Java 代碼如清單 1 所示:

    清單 1. 使用 if-else 語句實現(xiàn)業(yè)務規(guī)則邏輯

    Machine machine = ... 
    // Assign tests 
    Collections.sort(machine.getFunctions()); 
    int index; 
     
    if (machine.getType().equals("Type1")) { 
      Test test1 = ... 
      Test test2 = ... 
      Test test5 = ... 
      machine.getTests().add(test1); 
      machine.getTests().add(test2); 
      machine.getTests().add(test5); 
    } else if (machine.getType().equals("Type2")) { 
      index = Collections.binarySearch(machine.getFunctions(), "Router"); 
      if (index >= 0) { 
       Test test1 = ... 
       Test test3 = ... 
       machine.getTests().add(test1); 
       machine.getTests().add(test3); 
      } 
      index = Collections.binarySearch(machine.getFunctions(), "Gateway"); 
      if (index >= 0) { 
       Test test4 = ... 
       Test test3 = ... 
       machine.getTests().add(test4); 
       machine.getTests().add(test3); 
      } 
    ... 
    } 
     
    // Assign tests due date 
    Collections.sort(machine.getTests(), new TestComparator()); 
    ... 
    Test test1 = ... 
    index = Collections.binarySearch(machine.getTests(), test1); 
    if (index >= 0) { 
      // Set due date to 3 days after Machine was created 
      Timestamp creationTs = machine.getCreationTs(); 
      machine.setTestsDueTime(...); 
      return; 
    } 
     
    index = Collections.binarySearch(machine.getTests(), test2); 
    if (index >= 0) { 
      // Set due date to 7 days after Machine was created 
      Timestamp creationTs = machine.getCreationTs(); 
      machine.setTestsDueTime(...); 
      return; 
    } 
    ... 

      清單 1 中的代碼不是太復雜,但也并不簡單。如果要對其進行更改,需要十分小心。一堆互相纏繞的 if-else 語句正試圖捕獲已經(jīng)為應用程序標識的業(yè)務邏輯。如果您對業(yè)務規(guī)則不甚了解,就無法一眼看出代碼的意圖。

      導入示例程序

      使用 Drools 規(guī)則的示例程序附帶在本文的 ZIP 存檔中。程序使用 Drools 規(guī)則文件以聲明方法表示上一節(jié)定義的業(yè)務規(guī)則。它包含一個 Eclipse 3.2 Java 項目,該項目是使用 Drools 插件和 4.0.4 版的 Drools 規(guī)則引擎開發(fā)的。請遵循以下步驟設置示例程序:

      下載 ZIP 存檔(參見 下載)。

      下載并安裝 Drools Eclipse 插件。

      在 Eclipse 中,選擇該選項以導入 Existing Projects into Workspace,如圖 1 所示:

    圖 1. 將示例程序導入到 Eclipse 工作區(qū)


      然后選擇下載的存檔文件并將其導入工作區(qū)中。您將在工作區(qū)中發(fā)現(xiàn)一個名為 DroolsDemo 的新 Java 項目,如圖 2 所示:

    圖 2. 導入到工作區(qū)中的示例程序


      如果啟用了 Build automatically 選項,則代碼應該已編譯并可供使用。如果未啟用該選項,則現(xiàn)在構建 DroolsDemo 項目。

      檢查代碼

      現(xiàn)在來看一下示例程序中的代碼。該程序的 Java 類的核心集合位于 demo 包中。在該包中可以找到 Machine 和 Test 域對象類。Machine 類的實例表示要分配測試和測試到期日期的計算機機器。下面來看 Machine 類,如清單 2 所示:

    清單 2. Machine 類的實例變量

    public class Machine { 
     
      private String type; 
      private List functions = new ArrayList(); 
      private String serialNumber; 
      private Collection tests = new HashSet(); 
      private Timestamp creationTs; 
      private Timestamp testsDueTime; 
     
      public Machine() { 
       super(); 
       this.creationTs = new Timestamp(System.currentTimeMillis()); 
      } 
      ... 

      在清單 2 中可以看到 Machine 類的屬性有:

      type(表示為 string 屬性)—— 保存機器的類型值。

      functions (表示為 list)—— 保存機器的功能。

      testsDueTime (表示為 timestamp 變量)—— 保存分配的測試到期日期值。

      tests (Collection 對象)—— 保存分配的測試集合。

      注意,可以為機器分配多個測試,而且一個機器可以具有一個或多個功能。

      出于簡潔目的,機器的創(chuàng)建日期值設置為創(chuàng)建 Machine 類的實例時的當前時間。如果這是真實的應用程序,創(chuàng)建時間將設置為機器最終構建完成并準備測試的實際時間。

      Test 類的實例表示可以分配給機器的測試。Test實例由其 id 和 name 惟一描述,如清單 3 所示:

    清單 3. Test 類的實例變量

    public class Test { 
     
      public static Integer TEST1 = new Integer(1); 
      public static Integer TEST2 = new Integer(2); 
      public static Integer TEST3 = new Integer(3); 
      public static Integer TEST4 = new Integer(4); 
      public static Integer TEST5 = new Integer(5); 
     
      private Integer id; 
      private String name; 
      private String description; 
      public Test() { 
       super(); 
      } 
      ... 

      示例程序使用 Drools 規(guī)則引擎對 Machine 類的實例求值。基于 Machine 實例的 type 和 functions 屬性的值,規(guī)則引擎確定應分配給 tests 和 testsDueTime 屬性的值。

      在 demo 包中,還會發(fā)現(xiàn) Test 對象的數(shù)據(jù)訪問對象 (TestDAOImpl) 的實現(xiàn),它允許您按照 ID 查找 Test 實例。該數(shù)據(jù)訪問對象極其簡單;它不連接任何外部資源(比如關系數(shù)據(jù)庫)以獲得 Test 實例。相反,在其定義中硬編碼了預定義的 Test 實例集合。在現(xiàn)實世界中,您可能會具有連接外部資源以檢索 Test 對象的數(shù)據(jù)訪問對象。

      RulesEngine 類

      demo 中比較重要(如果不是最重要的)的一個類是 RulesEngine 類。該類的實例用作封裝邏輯以訪問 Drools 類的包裝器對象。可以在您自己的 Java 項目中容易地重用該類,因為它所包含的邏輯不是特定于示例程序的。清單 4 展示了該類的屬性和構造函數(shù):

    清單 4. RulesEngine 類的實例變量和構造函數(shù)

    public class RulesEngine { 
     
      private RuleBase rules; 
      private boolean debug = false; 
     
      public RulesEngine(String rulesFile) throws RulesEngineException { 
       super(); 
       try { 
         // Read in the rules source file 
         Reader source = new InputStreamReader(RulesEngine.class 
          .getResourceAsStream("/" + rulesFile)); 
         // Use package builder to build up a rule package 
         PackageBuilder builder = new PackageBuilder(); 
         // This parses and compiles in one step 
         builder.addPackageFromDrl(source); 
         // Get the compiled package 
         Package pkg = builder.getPackage(); 
         // Add the package to a rulebase (deploy the rule package). 
         rules = RuleBaseFactory.newRuleBase(); 
         rules.addPackage(pkg); 
       } catch (Exception e) { 
         throw new RulesEngineException( 
          "Could not load/compile rules file: " + rulesFile, e); 
       } 
      } 
      ... 

      在清單 4 中可以看到,RulesEngine 類的構造函數(shù)接受字符串值形式的參數(shù),該值表示包含業(yè)務規(guī)則集合的文件的名稱。該構造函數(shù)使用 PackageBuilder 類的實例解析和編譯源文件中包含的規(guī)則。(注意: 該代碼假設規(guī)則文件位于程序類路徑中名為 rules 的文件夾中。)然后,使用 PackageBuilder 實例將所有編譯好的規(guī)則合并為一個二進制 Package 實例。然后,使用這個實例配置 Drools RuleBase 類的一個實例,后者被分配給 RulesEngine 類的 rules 屬性。可以將這個類的實例看作規(guī)則文件中所包含規(guī)則的內存中表示。

      清單 5 展示了 RulesEngine 類的 executeRules() 方法:

    清單 5. RulesEngine 類的 executeRules() 方法

    public void executeRules(WorkingEnvironmentCallback callback) { 
      WorkingMemory workingMemory = rules.newStatefulSession(); 
      if (debug) { 
       workingMemory 
         .addEventListener(new DebugWorkingMemoryEventListener()); 
      } 
      callback.initEnvironment(workingMemory); 
      workingMemory.fireAllRules(); 
    } 

      executeRules() 方法幾乎包含了 Java 代碼中的所有魔力。調用該方法執(zhí)行先前加載到類構造函數(shù)中的規(guī)則。Drools WorkingMemory 類的實例用于斷言或聲明知識,規(guī)則引擎應使用它來確定應執(zhí)行的結果。(如果滿足規(guī)則的所有條件,則執(zhí)行該規(guī)則的結果。)將知識當作規(guī)則引擎用于確定是否應啟動規(guī)則的數(shù)據(jù)或信息。例如,規(guī)則引擎的知識可以包含一個或多個對象及其屬性的當前狀態(tài)。

      規(guī)則結果在調用 WorkingMemory 對象的 fireAllRules() 方法時執(zhí)行。您可能奇怪(我希望您如此)知識是如何插入到 WorkingMemory 實例中的。如果仔細看一下該方法的簽名,將會注意到所傳遞的參數(shù)是 WorkingEnvironmentCallback 接口的實例。executeRules() 方法的調用者需要創(chuàng)建實現(xiàn)該接口的對象。該接口只需要開發(fā)人員實現(xiàn)一個方法(參見清單 6 ):

    清單 6. WorkingEnvironmentCallback 接口

    public interface WorkingEnvironmentCallback { 
      void initEnvironment(WorkingMemory workingMemory) throws FactException; 
    } 

      所以,應該是 executeRules() 方法的調用者將知識插入到 WorkingMemory 實例中的。稍后將展示這是如何實現(xiàn)的。

      TestsRulesEngine 類

      清單 7 展示了 TestsRulesEngine 類,它也位于 demo 包中:

    清單 7. TestsRulesEngine 類

    public class TestsRulesEngine { 
     
      private RulesEngine rulesEngine; 
      private TestDAO testDAO; 
     
      public TestsRulesEngine(TestDAO testDAO) throws RulesEngineException { 
       super(); 
       rulesEngine = new RulesEngine("testRules1.drl"); 
       this.testDAO = testDAO; 
      } 
     
      public void assignTests(final Machine machine) { 
       rulesEngine.executeRules(new WorkingEnvironmentCallback() { 
         public void initEnvironment(WorkingMemory workingMemory) { 
          // Set globals first before asserting/inserting any knowledge! 
          workingMemory.setGlobal("testDAO", testDAO); 
          workingMemory.insert(machine); 
         }; 
       }); 
      } 
    } 

      TestsRulesEngine 類只有兩個實例變量。rulesEngine 屬性是 RulesEngine 類的實例。 testDAO 屬性保存對 TestDAO 接口的具體實現(xiàn)的引用。 rulesEngine 對象是使用 "testRules1.drl" 字符串作為其構造函數(shù)的參數(shù)實例化的。testRules1.drl 文件以聲明方式捕獲 要解決的問題 中的業(yè)務規(guī)則。 TestsRulesEngine 類的 assignTests() 方法調用 RulesEngine 類的 executeRules() 方法。在這個方法中,創(chuàng)建了 WorkingEnvironmentCallback 接口的一個匿名實例,然后將該實例作為參數(shù)傳遞給 executeRules() 方法。

      如果查看 assignTests() 方法的實現(xiàn),可以看到知識是如何插入到 WorkingMemory 實例中的。 WorkingMemory 類的 insert() 方法被調用以聲明在對規(guī)則求值時規(guī)則引擎應使用的知識。在這種情況下,知識由 Machine 類的一個實例組成。被插入的對象用于對規(guī)則的條件求值。

      如果在對條件求值時,需要讓規(guī)則引擎引用未 用作知識的對象,則應使用 WorkingMemory 類的 setGlobal() 方法。在示例程序中,setGlobal() 方法將對 TestDAO 實例的引用傳遞給規(guī)則引擎。然后規(guī)則引擎使用 TestDAO 實例查找它可能需要的任何 Test 實例。

      TestsRulesEngine 類是示例程序中惟一的 Java 代碼,它包含專門致力于為機器分配測試和測試到期日期的實現(xiàn)的邏輯。該類中的邏輯永遠不需要更改,即使業(yè)務規(guī)則需要更新時也是如此。

      Drools 規(guī)則文件

      如前所述,testRules.xml 文件包含規(guī)則引擎為機器分配測試和測試到期日期所遵循的規(guī)則。它使用 Drools 本地語言表達所包含的規(guī)則。

      Drools 規(guī)則文件有一個或多個 rule 聲明。每個 rule 聲明由一個或多個 conditional 元素以及要執(zhí)行的一個或多個 consequences 或 actions 組成。一個規(guī)則文件還可以有多個(即 0 個或多個)import 聲明、多個 global 聲明以及多個 function 聲明。

      理解 Drools 規(guī)則文件組成最好的方法是查看一個真正的規(guī)則文件。下面來看 testRules1.drl 文件的第一部分,如清單 8 所示:

    清單 8. testRules1.drl 文件的第一部分

    package demo; 
     
    import demo.Machine; 
    import demo.Test; 
    import demo.TestDAO; 
    import java.util.Calendar; 
    import java.sql.Timestamp; 
    global TestDAO testDAO; 

      在清單 8 中,可以看到 import 聲明如何讓規(guī)則執(zhí)行引擎知道在哪里查找將在規(guī)則中使用的對象的類定義。global 聲明讓規(guī)則引擎知道,某個對象應該可以從規(guī)則中訪問,但該對象不應是用于對規(guī)則條件求值的知識的一部分。可以將 global 聲明看作規(guī)則中的全局變量。對于 global 聲明,需要指定它的類型(即類名)和想要用于引用它的標識符(即變量名)。global 聲明中的這個標識符名稱應該與調用 WorkingMemory 類的 setGlobal() 方法時使用的標識符值匹配,在此即為 testDAO (參見 清單 7)。

      function 關鍵詞用于定義一個 Java 函數(shù)(參見 清單 9)。如果看到 consequence(稍后將討論)中重復的代碼,則應該提取該代碼并將其編寫為一個 Java 函數(shù)。但是,這樣做時要小心,避免在 Drools 規(guī)則文件中編寫復雜的 Java 代碼。規(guī)則文件中定義的 Java 函數(shù)應該簡短易懂。這不是 Drools 的技術限制。如果想要在規(guī)則文件中編寫復雜的 Java 代碼,也可以。但這樣做可能會讓您的代碼更加難以測試、調試和維護。復雜的 Java 代碼應該是 Java 類的一部分。如果需要 Drools 規(guī)則執(zhí)行引擎調用復雜的 Java 代碼,則可以將對包含復雜代碼的 Java 類的引用作為全局數(shù)據(jù)傳遞給規(guī)則引擎。

    清單 9. testRules1.drl 文件中定義的 Java 函數(shù)

    function void setTestsDueTime(Machine machine, int numberOfDays) { 
      setDueTime(machine, Calendar.DATE, numberOfDays); 
    } 
     
    function void setDueTime(Machine machine, int field, int amount) { 
      Calendar calendar = Calendar.getInstance(); 
      calendar.setTime(machine.getCreationTs()); 
      calendar.add(field, amount); 
      machine.setTestsDueTime(new Timestamp(calendar.getTimeInMillis())); 
    } 
     ... 

      清單 10 展示了 testRules1.drl 文件中定義的第一個規(guī)則:

    清單 10. testRules1.drl 中定義的第一個規(guī)則

    rule "Tests for type1 machine" 
    salience 100 
    when 
      machine : Machine( type == "Type1" ) 
    then 
      Test test1 = testDAO.findByKey(Test.TEST1); 
      Test test2 = testDAO.findByKey(Test.TEST2); 
      Test test5 = testDAO.findByKey(Test.TEST5); 
      machine.getTests().add(test1); 
      machine.getTests().add(test2); 
      machine.getTests().add(test5); 
      insert( test1 ); 
      insert( test2 ); 
      insert( test5 ); 
    end 

      如清單 10 所示,rule 聲明有一個惟一標識它的 name。還可以看到,when 關鍵詞定義規(guī)則中的條件塊,then 關鍵詞定義結果塊。清單 10 中顯示的規(guī)則有一個引用 Machine 對象的條件元素。如果回到 清單 7 可以看到, Machine 對象被插入到 WorkingMemory 對象中。這正是這個規(guī)則中使用的對象。條件元素對 Machine 實例(知識的一部分)求值,以確定是否應執(zhí)行規(guī)則的結果。如果條件元素等于 true,則啟動或執(zhí)行結果。從清單 10 中還可以看出,結果只不過是一個 Java 語言語句。通過快速瀏覽該規(guī)則,可以很容易地識別出這是下列業(yè)務規(guī)則的實現(xiàn):

      如果計算機是 Type1,則只能在該機器上執(zhí)行 Test1、Test2 和 Test5。

      因此,該規(guī)則的條件元素檢查( Machine 對象的) type 屬性是否為 Type1。 (在條件元素中,只要對象遵從 Java bean 模式,就可以直接訪問對象的屬性,而不必調用 getter 方法。)如果該屬性的值為 true,那么將 Machine 實例的一個引用分配給 machine 標識符。然后,在規(guī)則的結果塊使用該引用,將測試分配給 Machine 對象。

      在該規(guī)則中,惟一看上去有些奇怪的語句是最后三條結果語句。回憶 “要解決的問題” 小節(jié)中的業(yè)務規(guī)則,應該分配為測試到期日期的值取決于分配給機器的測試。因此,分配給機器的測試需要成為規(guī)則執(zhí)行引擎在對規(guī)則求值時所使用的知識的一部分。這正是這三條語句的作用。這些語句使用一個名為 insert 的方法更新規(guī)則引擎中的知識。

      確定規(guī)則執(zhí)行順序

      規(guī)則的另一個重要的方面是可選的 salience 屬性。使用它可以讓規(guī)則執(zhí)行引擎知道應該啟動規(guī)則的結果語句的順序。具有最高顯著值的規(guī)則的結果語句首先執(zhí)行;具有第二高顯著值的規(guī)則的結果語句第二執(zhí)行,依此類推。當您需要讓規(guī)則按預定義順序啟動時,這一點非常重要,很快您將會看到。

      testRules1.drl 文件中接下來的四個規(guī)則實現(xiàn)與機器測試分配有關的其他業(yè)務規(guī)則(參見清單 11)。這些規(guī)則與剛討論的第一個規(guī)則非常相似。注意,salience 屬性值對于前五個規(guī)則是相同的;不管這五個規(guī)則的啟動順序如何,其執(zhí)行結果將相同。如果結果受規(guī)則的啟動順序影響,則需要為規(guī)則指定不同的顯著值。

    清單 11. testRules1.drl 文件中與測試分配有關的其他規(guī)則

    rule "Tests for type2, DNS server machine" 
    salience 100 
    when 
      machine : Machine( type == "Type2", functions contains "DNS Server") 
    then 
      Test test5 = testDAO.findByKey(Test.TEST5); 
      Test test4 = testDAO.findByKey(Test.TEST4); 
      machine.getTests().add(test5); 
      machine.getTests().add(test4); 
      insert( test4 ); 
      insert( test5 ); 
    end 
     
    rule "Tests for type2, DDNS server machine" 
    salience 100 
    when 
      machine : Machine( type == "Type2", functions contains "DDNS Server") 
    then 
      Test test2 = testDAO.findByKey(Test.TEST2); 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      machine.getTests().add(test2); 
      machine.getTests().add(test3); 
      insert( test2 ); 
      insert( test3 ); 
    end 
     
    rule "Tests for type2, Gateway machine" 
    salience 100 
    when 
      machine : Machine( type == "Type2", functions contains "Gateway") 
    then 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      Test test4 = testDAO.findByKey(Test.TEST4); 
      machine.getTests().add(test3); 
      machine.getTests().add(test4); 
      insert( test3 ); 
      insert( test4 ); 
    end 
     
    rule "Tests for type2, Router machine" 
    salience 100 
    when 
      machine : Machine( type == "Type2", functions contains "Router") 
    then 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      Test test1 = testDAO.findByKey(Test.TEST1); 
      machine.getTests().add(test3); 
      machine.getTests().add(test1); 
      insert( test1 ); 
      insert( test3 ); 
    end 
    ... 

      清單 12 展示了 Drools 規(guī)則文件中的其他規(guī)則。您可能已經(jīng)猜到,這些規(guī)則與測試到期日期的分配有關:

    清單 12. testRules1.drl 文件中與測試到期日期分配有關的規(guī)則

    rule "Due date for Test 5" 
    salience 50 
    when 
      machine : Machine() 
      Test( id == Test.TEST5 ) 
    then 
      setTestsDueTime(machine, 14); 
    end 
     
    rule "Due date for Test 4" 
    salience 40 
    when 
      machine : Machine() 
      Test( id == Test.TEST4 ) 
    then 
      setTestsDueTime(machine, 12); 
    end 
     
    rule "Due date for Test 3" 
    salience 30 
    when 
      machine : Machine() 
      Test( id == Test.TEST3 ) 
    then 
      setTestsDueTime(machine, 10); 
    end 
     
    rule "Due date for Test 2" 
    salience 20 
    when 
      machine : Machine() 
      Test( id == Test.TEST2 ) 
    then 
      setTestsDueTime(machine, 7); 
    end 
     
    rule "Due date for Test 1" 
    salience 10 
    when 
      machine : Machine() 
      Test( id == Test.TEST1 ) 
    then 
      setTestsDueTime(machine, 3); 
    end 

      這些規(guī)則的實現(xiàn)比用于分配測試的規(guī)則的實現(xiàn)要略微簡單一些,但我發(fā)現(xiàn)它們更有趣一些,原因有四。

      第一,注意這些規(guī)則的執(zhí)行順序很重要。結果(即,分配給 Machine 實例的 testsDueTime 屬性的值)受這些規(guī)則的啟動順序所影響。如果查看 要解決的問題 中詳細的業(yè)務規(guī)則,您將注意到用于分配測試到期日期的規(guī)則具有優(yōu)先順序。例如,如果已經(jīng)將 Test3、Test4 和 Test5 分配給機器,則測試到期日期應距離機器的創(chuàng)建日期 10 天。原因在于 Test3 的到期日期規(guī)則優(yōu)先于 Test4 和 Test5 的測試到期日期規(guī)則。如何在 Drools 規(guī)則文件中表達這一點呢答案是 salience 屬性。為 testsDueTime 屬性設置值的規(guī)則的 salience 屬性值不同。Test1 的測試到期日期規(guī)則優(yōu)先于所有其他測試到期日期規(guī)則,所以這應是要啟動的最后一個規(guī)則。換句話說,如果 Test1 是分配給機器的測試之一,則由該規(guī)則分配的值應該是優(yōu)先使用的值。所以,該規(guī)則的 salience 屬性值最低:10。

      第二,每個規(guī)則有兩個條件元素。第一個元素只檢查工作內存中是否存在一個 Machine 實例。(注意,這里不會對 Machine 對象的屬性進行比較。)當這個元素等于 true 時,它將一個引用分配給 Machine 對象,而后者將在規(guī)則的結果塊被用到。如果不分配這個引用,那么就無法將測試到期日期分配給 Machine 對象。第二個條件元素檢查 Test 對象的 id 屬性。當且僅當這兩個條件元素都等于 true 時,才執(zhí)行規(guī)則的結果元素。

      第三,在 Test 類的一個實例成為知識的一部分(即,包含在工作內存中)之前,Drools 規(guī)則執(zhí)行引擎不會(也不能)對這些規(guī)則的條件塊求值。這很符合邏輯,因為如果工作內存中還沒有 Test 類的一個實例,那么規(guī)則執(zhí)行引擎就無法執(zhí)行這些規(guī)則的條件中所包含的比較。如果您想知道 Test 實例何時成為知識的一部分,那么可以回憶,在與分配測試相關規(guī)則的結果的執(zhí)行期間,一個或多個 Test 實例被插入到工作內存中。(參見 清單 10 和 清單 11)。

      第四,注意這些規(guī)則的結果塊相當簡短。原因在于在所有結果塊中調用了規(guī)則文件中之前使用 function 關鍵詞定義的 setTestsDueTime() Java 方法。該方法為 testsDueTime 屬性實際分配值。

      測試代碼

      既然已經(jīng)仔細檢查了實現(xiàn)業(yè)務規(guī)則邏輯的代碼,現(xiàn)在應該檢查它是否能工作。要執(zhí)行示例程序,運行 demo.test 中的 TestsRulesEngineTest JUnit 測試。

      在該測試中,創(chuàng)建了 5 個 Machine 對象,每個對象具有不同的屬性集合(序號、類型和功能)。為這五個 Machine 對象的每一個都調用 TestsRulesEngine 類的 assignTests() 方法。一旦 assignTests() 方法完成其執(zhí)行,就執(zhí)行斷言以驗證 testRules1.drl 中指定的業(yè)務規(guī)則邏輯是否正確(參見清單 13)。可以修改 TestsRulesEngineTest JUnit 類以多添加幾個具有不同屬性的 Machine 實例,然后使用斷言驗證結果是否跟預期一樣。

    清單 13. testTestsRulesEngine() 方法中用于驗證業(yè)務邏輯實現(xiàn)是否正確的斷言

    public void testTestsRulesEngine() throws Exception { 
      while (machineResultSet.next()) { 
       Machine machine = machineResultSet.getMachine(); 
       testsRulesEngine.assignTests(machine); 
       Timestamp creationTs = machine.getCreationTs(); 
       Calendar calendar = Calendar.getInstance(); 
       calendar.setTime(creationTs); 
       Timestamp testsDueTime = machine.getTestsDueTime(); 
     
       if (machine.getSerialNumber().equals("1234A")) { 
         assertEquals(3, machine.getTests().size()); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST1))); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST2))); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST5))); 
         calendar.add(Calendar.DATE, 3); 
         assertEquals(calendar.getTime(), testsDueTime); 
     
       } else if (machine.getSerialNumber().equals("1234B")) { 
         assertEquals(4, machine.getTests().size()); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST5))); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST4))); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST3))); 
         assertTrue(machine.getTests().contains(testDAO.findByKey(Test.TEST2))); 
         calendar.add(Calendar.DATE, 7); 
         assertEquals(calendar.getTime(), testsDueTime); 
    ... 

      關于知識的其他備注

      值得一提的是,除了將對象插入至工作內存之外,還可以在工作內存中修改對象或從中撤回對象。可以在規(guī)則的結果塊中進行這些操作。如果在結果語句中修改作為當前知識一部分的對象,并且所修改的屬性被用在 condition 元素中以確定是否應啟動規(guī)則,則應在結果塊中調用 update() 方法。調用 update() 方法時,您讓 Drools 規(guī)則引擎知道對象已更新且引用該對象的任何規(guī)則的任何條件元素(例如,檢查一個或多個對象屬性的值)應再次求值,以確定條件的結果現(xiàn)在是 true 還是 false。這意味著甚至當前活動規(guī)則(在其結果塊中修改對象的規(guī)則)的條件都可以再次求值,這可能導致規(guī)則再次啟動,并可能導致無限循環(huán)。如果不希望這種情況發(fā)生,則應該包括 rule 的可選 no-loop 屬性并將其賦值為 true。

      清單 14 用兩個規(guī)則的定義的偽代碼演示了這種情況。Rule 1 修改 objectA 的 property1。然后它調用 update() 方法,以允許規(guī)則執(zhí)行引擎知道該更新,從而觸發(fā)對引用 objectA 的規(guī)則的條件元素的重新求值。因此,啟動 Rule 1 的條件應再次求值。因為該條件應再次等于 true(property2 的值仍相同,因為它在結果塊中未更改),Rule 1 應再次啟動,從而導致無限循環(huán)的執(zhí)行。為了避免這種情況,添加 no-loop 屬性并將其賦值為 true,從而避免當前活動規(guī)則再次執(zhí)行。

    清單 14. 修改工作內存中的對象并使用規(guī)則元素的 no-loop 屬性

    ... 
    rule "Rule 1" 
    salience 100 
    no-loop true 
    when 
      objectA : ClassA (property2().equals(...)) 
    then 
      Object value = ... 
      objectA.setProperty1(value); 
      update( objectA ); 
    end 
     
    rule "Rule 2" 
    salience 100 
    when 
      objectB : ClassB() 
      objectA : ClassA ( property1().equals(objectB) ) 
      ... 
    then 
      ... 
    end 
    ... 

      如果對象不再是知識的一部分,則應將該對象從工作內存中撤回(參見清單 15)。通過在結果塊中調用 retract() 方法實現(xiàn)這一點。當從工作內存中移除對象之后,引用該對象的(屬于任何規(guī)則的)任何條件元素將不被求值。因為對象不再作為知識的一部分存在,所以規(guī)則沒有啟動的機會。

    清單 15. 從工作內存中撤回對象

    ... 
    rule "Rule 1" 
    salience 100 
    when 
      objectB : ... 
      objectA : ... 
    then 
      Object value = ... 
      objectA.setProperty1(value); 
      retract(objectB); 
    end 
     
    rule "Rule 2" 
    salience 90 
    when 
      objectB : ClassB ( property().equals(...) ) 
    then 
     ... 
    end 
    ... 

      清單 15 包含兩個規(guī)則的定義的偽代碼。假設啟動兩個規(guī)則的條件等于 true。則應該首先啟動 Rule 1,因為 Rule 1 的顯著值比 Rule 2 的高。現(xiàn)在,注意在 Rule 1 的結果塊中,objectB 從工作內存中撤回(也就是說,objectB 不再是知識的一部分)。該動作更改了規(guī)則引擎的 “執(zhí)行日程”,因為現(xiàn)在將不啟動 Rule 2。原因在于曾經(jīng)為真值的用于啟動 Rule 2 的條件不再為真,因為它引用了一個不再是知識的一部分的對象(objectB)。如果清單 15 中還有其他規(guī)則引用了 objectB,且這些規(guī)則尚未啟動,則它們將不會再啟動了。

      作為關于如何修改工作內存中當前知識的具體例子,我將重新編寫前面討論的規(guī)則源文件。業(yè)務規(guī)則仍然與 “要解決的問題” 小節(jié)中列出的一樣。但是,我將使用這些規(guī)則的不同實現(xiàn)取得相同的結果。按照這種方法,任何時候工作內存中惟一可用的知識是 Machine 實例。換句話說,規(guī)則的條件元素將只針對 Machine 對象的屬性執(zhí)行比較。這與之前的方法有所不同,之前的方法還要對 Test 對象的屬性進行比較(參見 清單 12)。 這些規(guī)則的新實現(xiàn)被捕獲在示例應用程序的 testRules2.drl 文件中。清單 16 展示了 testRules2.drl 中與分配測試相關的規(guī)則:

    清單 16. testRules2.drl 中與分配測試相關的規(guī)則

    rule "Tests for type1 machine" 
    lock-on-active true 
    salience 100 
     
    when 
      machine : Machine( type == "Type1" ) 
    then 
      Test test1 = testDAO.findByKey(Test.TEST1); 
      Test test2 = testDAO.findByKey(Test.TEST2); 
      Test test5 = testDAO.findByKey(Test.TEST5); 
      machine.getTests().add(test1); 
      machine.getTests().add(test2); 
      machine.getTests().add(test5); 
      update( machine ); 
    end 
     
    rule "Tests for type2, DNS server machine" 
    lock-on-active true 
    salience 100 
     
    when 
      machine : Machine( type == "Type2", functions contains "DNS Server") 
    then 
      Test test5 = testDAO.findByKey(Test.TEST5); 
      Test test4 = testDAO.findByKey(Test.TEST4); 
      machine.getTests().add(test5); 
      machine.getTests().add(test4); 
      update( machine ); 
    end 
     
    rule "Tests for type2, DDNS server machine" 
    lock-on-active true 
    salience 100 
     
    when 
      machine : Machine( type == "Type2", functions contains "DDNS Server") 
    then 
      Test test2 = testDAO.findByKey(Test.TEST2); 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      machine.getTests().add(test2); 
      machine.getTests().add(test3); 
      update( machine ); 
    end 
     
    rule "Tests for type2, Gateway machine" 
    lock-on-active true 
    salience 100 
     
    when 
      machine : Machine( type == "Type2", functions contains "Gateway") 
    then 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      Test test4 = testDAO.findByKey(Test.TEST4); 
      machine.getTests().add(test3); 
      machine.getTests().add(test4); 
      update( machine ); 
    end 
     
    rule "Tests for type2, Router machine" 
    lock-on-active true 
    salience 100 
     
    when 
      machine : Machine( type == "Type2", functions contains "Router") 
    then 
      Test test3 = testDAO.findByKey(Test.TEST3); 
      Test test1 = testDAO.findByKey(Test.TEST1); 
      machine.getTests().add(test3); 
      machine.getTests().add(test1); 
      update( machine ); 
    end 
    ... 

      如果將清單 16 中第一個規(guī)則的定義與 清單 10 中的定義相比較,可以看到,新方法沒有將分配給 Machine 對象的 Test 實例插入到工作內存中,而是由規(guī)則的結果塊調用 update() 方法,讓規(guī)則引擎知道 Machine 對象已被修改。(Test 實例被添加/指定給它。) 如果看看清單 16 中其他的規(guī)則,應該可以看到,每當將測試分配給一個 Machine 對象時,都采用這種方法:一個或多個 Test 實例被分配給一個 Machine 實例,然后,修改工作知識,并通知規(guī)則引擎。

      還應注意清單 16 中使用的 active-lock 屬性。該屬性的值被設為 true;如果不是這樣,在執(zhí)行這些規(guī)則時將陷入無限循環(huán)。將它設為 true 可以確保當一個規(guī)則更新工作內存中的知識時,最終不會導致對規(guī)則重新求值并重新執(zhí)行規(guī)則,也就不會導致無限循環(huán)。可以將 active-lock 屬性 看作 no-loop 屬性的加強版。 no-loop 屬性確保當修改知識的規(guī)則更新后不會再被調用,而 active-lock 屬性則確保在修改知識以后,文件中的任何規(guī)則(其 active-lock 屬性被設為 true)不會重新執(zhí)行。

      清單 17 展示了其他規(guī)則有何更改:

    清單 17. testRules2.drl 中與分配測試到期日期有關的規(guī)則

    rule "Due date for Test 5" 
    salience 50 
    when 
      machine : Machine(tests contains (testDAO.findByKey(Test.TEST5))) 
    then 
      setTestsDueTime(machine, 14); 
    end 
     
    rule "Due date for Test 4" 
    salience 40 
    when 
      machine : Machine(tests contains (testDAO.findByKey(Test.TEST4))) 
    then 
      setTestsDueTime(machine, 12); 
    end 
     
    rule "Due date for Test 3" 
    salience 30 
    when 
      machine : Machine(tests contains (testDAO.findByKey(Test.TEST3))) 
    then 
      setTestsDueTime(machine, 10); 
    end 
     
    rule "Due date for Test 2" 
    salience 20 
    when 
      machine : Machine(tests contains (testDAO.findByKey(Test.TEST2))) 
    then 
      setTestsDueTime(machine, 7); 
    end 
     
    rule "Due date for Test 1" 
    salience 10 
    when 
      machine : Machine(tests contains (testDAO.findByKey(Test.TEST1))) 
    then 
      setTestsDueTime(machine, 3); 
    end 

      這些規(guī)則的條件元素現(xiàn)在檢查一個 Machine 對象的 tests 集合,以確定它是否包含特定的 Test 實例。因此,如前所述,按照這種方法,規(guī)則引擎只處理工作內存中的一個對象(一個 Machine 實例),而不是多個對象(Machine 和 Test 實例)。

      要測試 testRules2.drl 文件,只需編輯示例應用程序提供的 TestsRulesEngine 類(參見 清單 7):將 "testRules1.drl" 字符串改為 "testRules2.drl",然后運行 TestsRulesEngineTest JUnit 測試。所有測試都應該成功,就像將 testRules1.drl 作為規(guī)則源一樣。

      關于斷點的注意事項

      如前所述,用于 Eclipse 的 Drools 插件允許在規(guī)則文件中設置斷點。要清楚,只有在調試作為 “Drools Application” 的程序時,才會啟用這些斷點。否則,調試器會忽略它們。

      例如,假設您想調試作為 “Drools Application” 的 TestsRulesEngineTest JUnit 測試類。在 Eclipse 中打開常見的 Debug 對話框。在這個對話框中,應該可以看到一個 “Drools Application” 類別。在這個類別下,創(chuàng)建一個新的啟動配置。在這個新配置的 Main 選項卡中,應該可以看到一個 Project 字段和一個 Main class 字段。對于 Project 字段,選擇 Drools4Demo 項目。對于 Main class 字段,輸入 junit.textui.TestRunner(參見圖 3)。

    圖 3. TestsRulesEngineTest 類的 Drools application 啟動配置(Main 選項卡)

      查看原圖(大圖)

      現(xiàn)在選擇 Arguments 選項卡并輸入 -t demo.test.TestsRulesEngineTest 作為程序參數(shù)(參見圖 4)。輸入該參數(shù)后,單擊對話框右下角的 Apply 按鈕,保存新的啟動配置。然后,可以單擊 Debug 按鈕,開始以 “Drools Application” 的形式調試 TestsRulesEngineTest JUnit 類。如果之前在 testRules1.drl 或 testRules2.drl 中添加了斷點,那么當使用這個啟動配置時,調試器應該會在遇到這些斷點時停下來。

    圖 4. TestsRulesEngineTest 類的 Drools Application 啟動配置(Arguments 選項卡)

      查看原圖(大圖)

      結束語

      使用規(guī)則引擎可以顯著降低實現(xiàn) Java 應用程序中業(yè)務規(guī)則邏輯的組件的復雜性。使用規(guī)則引擎以聲明方法表達規(guī)則的應用程序比其他應用程序更容易維護和擴展。正如您所看到的,Drools 是一種功能強大的靈活的規(guī)則引擎實現(xiàn)。使用 Drools 的特性和能力,您應該能夠以聲明方式實現(xiàn)應用程序的復雜業(yè)務邏輯。Drools 使得學習和使用聲明式編程對于 Java 開發(fā)人員來說相當容易。

      本文展示的 Drools 類是特定于 Drools 的。如果要在示例程序中使用另一種規(guī)則引擎實現(xiàn),代碼需要作少許更改。因為 Drools 是 JSR 94 兼容的,所以可以使用 Java Rule Engine API(如 JSR 94 中所指定)設計特定于 Drools 的類的接口。(Java Rule Engine API 用于 JDBC 在數(shù)據(jù)庫中的規(guī)則引擎。)如果使用該 API,則可以無需更改 Java 代碼而將規(guī)則引擎實現(xiàn)更改為另一個不同的實現(xiàn),只要這個不同的實現(xiàn)也是 JSR 94 兼容的。JSR 94 不解析包含業(yè)務規(guī)則的規(guī)則文件(在本文示例應用程序中為 testRules1.drl)的結構。文件的結構將仍取決于您選擇的規(guī)則引擎實現(xiàn)。作為練習,可以修改示例程序以使它使用 Java Rule Engine API,而不是使用 Java 代碼引用特定于 Drools 的類。

       本文示例源代碼或素材下載

?

總結

以上是生活随笔為你收集整理的使用 Drools 规则引擎实现业务逻辑,可调试drl文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

一本久道久久综合婷婷五月 | 2019nv天堂香蕉在线观看 | 亚洲精品一区二区三区婷婷月 | 午夜无码人妻av大片色欲 | 国产精品久久久久久亚洲毛片 | 国产精品久久国产精品99 | 在教室伦流澡到高潮hnp视频 | 国产精品人妻一区二区三区四 | 中文亚洲成a人片在线观看 | 99久久久无码国产精品免费 | 欧美 丝袜 自拍 制服 另类 | 小泽玛莉亚一区二区视频在线 | 国产熟女一区二区三区四区五区 | 国内丰满熟女出轨videos | 好男人www社区 | 老熟妇乱子伦牲交视频 | 国产艳妇av在线观看果冻传媒 | 亚洲 a v无 码免 费 成 人 a v | 亚洲色欲久久久综合网东京热 | 日本熟妇乱子伦xxxx | 中文字幕无码人妻少妇免费 | 亚洲码国产精品高潮在线 | 日本一区二区更新不卡 | 丰满人妻翻云覆雨呻吟视频 | 亚洲欧洲日本综合aⅴ在线 | 欧美成人免费全部网站 | 男人的天堂2018无码 | 亚洲色www成人永久网址 | 国产精品无码一区二区三区不卡 | 欧美人与善在线com | 一本加勒比波多野结衣 | 欧美三级a做爰在线观看 | 牲交欧美兽交欧美 | 国产区女主播在线观看 | 国产真实夫妇视频 | 曰本女人与公拘交酡免费视频 | 九九综合va免费看 | 免费观看又污又黄的网站 | 久久午夜无码鲁丝片午夜精品 | 婷婷色婷婷开心五月四房播播 | 免费播放一区二区三区 | 国产香蕉尹人视频在线 | 日韩精品乱码av一区二区 | 亚洲国产综合无码一区 | 激情内射亚州一区二区三区爱妻 | 久久久久久久久蜜桃 | 人人妻人人澡人人爽人人精品 | 狂野欧美性猛交免费视频 | 强辱丰满人妻hd中文字幕 | 理论片87福利理论电影 | 国产一区二区三区四区五区加勒比 | 国产特级毛片aaaaaa高潮流水 | 久久国语露脸国产精品电影 | 日本熟妇大屁股人妻 | 1000部夫妻午夜免费 | 九九久久精品国产免费看小说 | 国产福利视频一区二区 | 中文字幕人妻丝袜二区 | 无码国产乱人伦偷精品视频 | 亚洲精品国产精品乱码视色 | 国产激情一区二区三区 | 久久精品99久久香蕉国产色戒 | 欧美精品一区二区精品久久 | 欧洲熟妇色 欧美 | 欧美老妇交乱视频在线观看 | 激情国产av做激情国产爱 | 99视频精品全部免费免费观看 | 国产99久久精品一区二区 | 久久久av男人的天堂 | 香蕉久久久久久av成人 | 蜜桃av抽搐高潮一区二区 | 丁香啪啪综合成人亚洲 | 国模大胆一区二区三区 | 国产熟女一区二区三区四区五区 | 四虎4hu永久免费 | 日日碰狠狠躁久久躁蜜桃 | 国产av一区二区精品久久凹凸 | 亚洲精品一区二区三区在线 | 老子影院午夜精品无码 | 动漫av网站免费观看 | 人妻少妇精品无码专区二区 | 国精产品一品二品国精品69xx | 中文无码成人免费视频在线观看 | 亚洲熟妇色xxxxx欧美老妇y | 婷婷五月综合缴情在线视频 | 亚无码乱人伦一区二区 | 任你躁国产自任一区二区三区 | 亚洲国产成人av在线观看 | 欧美xxxxx精品 | 欧美35页视频在线观看 | 人妻少妇精品无码专区动漫 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲人亚洲人成电影网站色 | 久久精品女人天堂av免费观看 | 99精品久久毛片a片 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 在线精品国产一区二区三区 | 久9re热视频这里只有精品 | 日本又色又爽又黄的a片18禁 | 国产无套内射久久久国产 | 麻豆蜜桃av蜜臀av色欲av | 对白脏话肉麻粗话av | 波多野结衣高清一区二区三区 | 天堂无码人妻精品一区二区三区 | 人妻少妇精品无码专区动漫 | 色综合久久中文娱乐网 | 中文字幕无线码免费人妻 | 亚洲精品久久久久avwww潮水 | 又大又紧又粉嫩18p少妇 | 亚洲va中文字幕无码久久不卡 | 荫蒂添的好舒服视频囗交 | 任你躁国产自任一区二区三区 | 中文字幕乱码亚洲无线三区 | 熟妇人妻激情偷爽文 | 正在播放老肥熟妇露脸 | 欧美日韩综合一区二区三区 | 久久久久亚洲精品中文字幕 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 日本精品高清一区二区 | 97夜夜澡人人爽人人喊中国片 | 国产免费久久久久久无码 | 国产精品二区一区二区aⅴ污介绍 | 久久久久av无码免费网 | 人妻少妇被猛烈进入中文字幕 | 精品aⅴ一区二区三区 | 久久人人爽人人爽人人片ⅴ | 国产熟妇高潮叫床视频播放 | 久久国产精品_国产精品 | 精品国产一区二区三区四区 | 亚洲一区二区三区含羞草 | 欧美性生交活xxxxxdddd | 精品aⅴ一区二区三区 | 久久无码专区国产精品s | 丰满人妻一区二区三区免费视频 | 老头边吃奶边弄进去呻吟 | www一区二区www免费 | 国语精品一区二区三区 | 亚洲一区二区三区在线观看网站 | 老子影院午夜精品无码 | 男人的天堂av网站 | 夜夜高潮次次欢爽av女 | 国产片av国语在线观看 | 日本熟妇人妻xxxxx人hd | 国产午夜亚洲精品不卡下载 | 国产无遮挡又黄又爽免费视频 | 老司机亚洲精品影院 | www国产精品内射老师 | 久久精品中文字幕大胸 | www国产亚洲精品久久网站 | 日韩精品一区二区av在线 | 久久成人a毛片免费观看网站 | 久久久久成人精品免费播放动漫 | 一区二区传媒有限公司 | 亚洲国产精品一区二区美利坚 | 成人无码视频在线观看网站 | 国产精品高潮呻吟av久久4虎 | 国产无遮挡又黄又爽免费视频 | 熟妇激情内射com | 精品无码国产自产拍在线观看蜜 | 最新国产麻豆aⅴ精品无码 | 欧美人与禽zoz0性伦交 | 色一情一乱一伦一区二区三欧美 | a片免费视频在线观看 | 在线观看国产一区二区三区 | 超碰97人人做人人爱少妇 | 狠狠色噜噜狠狠狠7777奇米 | 午夜精品久久久久久久 | 丰满人妻精品国产99aⅴ | 在线观看国产一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 沈阳熟女露脸对白视频 | 亚洲国精产品一二二线 | 波多野结衣乳巨码无在线观看 | 国产亲子乱弄免费视频 | 国产精品人人妻人人爽 | 一本色道久久综合亚洲精品不卡 | 久久精品中文字幕一区 | 国产精品久久久午夜夜伦鲁鲁 | 激情五月综合色婷婷一区二区 | 55夜色66夜色国产精品视频 | 三级4级全黄60分钟 | 99久久人妻精品免费一区 | 国产成人无码av在线影院 | 欧美黑人巨大xxxxx | 欧美精品国产综合久久 | 天堂久久天堂av色综合 | 成人av无码一区二区三区 | 欧美成人家庭影院 | 色欲人妻aaaaaaa无码 | 久久国内精品自在自线 | 中国大陆精品视频xxxx | www一区二区www免费 | 久久午夜无码鲁丝片午夜精品 | 又湿又紧又大又爽a视频国产 | 国产精品毛片一区二区 | 国产精品久久国产精品99 | 久久国产精品萌白酱免费 | 国产激情无码一区二区 | 亚洲成在人网站无码天堂 | 一本久道高清无码视频 | 日本大香伊一区二区三区 | 性做久久久久久久久 | 欧美人与牲动交xxxx | 2020最新国产自产精品 | 97夜夜澡人人爽人人喊中国片 | 高清国产亚洲精品自在久久 | 男女性色大片免费网站 | 欧美人与禽zoz0性伦交 | 中文字幕人成乱码熟女app | 日韩精品无码一本二本三本色 | 亚洲精品午夜国产va久久成人 | 久久精品国产一区二区三区 | 麻豆果冻传媒2021精品传媒一区下载 | 全黄性性激高免费视频 | 国产无av码在线观看 | 性史性农村dvd毛片 | 午夜无码人妻av大片色欲 | 色一情一乱一伦一视频免费看 | 亚洲成熟女人毛毛耸耸多 | 日本大乳高潮视频在线观看 | 成人无码精品1区2区3区免费看 | 久久99精品久久久久久 | 色婷婷久久一区二区三区麻豆 | 午夜福利一区二区三区在线观看 | 日韩亚洲欧美中文高清在线 | 亚洲成av人片在线观看无码不卡 | 狂野欧美性猛交免费视频 | 成人aaa片一区国产精品 | 日本大香伊一区二区三区 | 天海翼激烈高潮到腰振不止 | 水蜜桃色314在线观看 | 成人无码精品1区2区3区免费看 | 丰腴饱满的极品熟妇 | 久久aⅴ免费观看 | 国产无遮挡吃胸膜奶免费看 | 天堂а√在线地址中文在线 | 亚洲欧美精品伊人久久 | 久久国产精品偷任你爽任你 | 亚洲一区二区观看播放 | 又大又紧又粉嫩18p少妇 | 日韩精品乱码av一区二区 | 国产国产精品人在线视 | 天天摸天天碰天天添 | 丰满人妻精品国产99aⅴ | 国产人成高清在线视频99最全资源 | 狠狠cao日日穞夜夜穞av | 日本欧美一区二区三区乱码 | 中文字幕乱妇无码av在线 | 日本熟妇乱子伦xxxx | 亚洲精品久久久久久一区二区 | 99精品视频在线观看免费 | 无码精品国产va在线观看dvd | 久久久久成人精品免费播放动漫 | 天天拍夜夜添久久精品大 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 大肉大捧一进一出好爽视频 | 丰满人妻被黑人猛烈进入 | 精品久久8x国产免费观看 | 欧美成人午夜精品久久久 | 欧美自拍另类欧美综合图片区 | 蜜桃无码一区二区三区 | 日日摸日日碰夜夜爽av | 樱花草在线社区www | 99精品视频在线观看免费 | 久久久久亚洲精品中文字幕 | 国产性生大片免费观看性 | 日本一区二区三区免费高清 | 乱人伦人妻中文字幕无码久久网 | 正在播放老肥熟妇露脸 | 一本久道高清无码视频 | 四虎影视成人永久免费观看视频 | 最近中文2019字幕第二页 | 欧洲极品少妇 | 亚洲人成网站免费播放 | 久久国产劲爆∧v内射 | 日日摸日日碰夜夜爽av | 亚洲色无码一区二区三区 | 亚洲国产综合无码一区 | 久久久久se色偷偷亚洲精品av | 国内精品一区二区三区不卡 | 亚洲熟妇自偷自拍另类 | 乱人伦人妻中文字幕无码久久网 | 亚洲 日韩 欧美 成人 在线观看 | 狠狠色噜噜狠狠狠狠7777米奇 | 性色欲网站人妻丰满中文久久不卡 | 人妻中文无码久热丝袜 | 国产精品美女久久久久av爽李琼 | 亚洲色偷偷偷综合网 | 欧美日韩综合一区二区三区 | 亚洲人成网站在线播放942 | 在教室伦流澡到高潮hnp视频 | 精品无码国产一区二区三区av | 欧美国产日产一区二区 | 水蜜桃av无码 | 日韩人妻系列无码专区 | 色婷婷欧美在线播放内射 | 欧美日本日韩 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产 精品 自在自线 | 亚洲精品国偷拍自产在线麻豆 | 亚洲中文字幕成人无码 | 18精品久久久无码午夜福利 | 人人妻在人人 | 成人无码精品一区二区三区 | 国产激情综合五月久久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 强辱丰满人妻hd中文字幕 | 粉嫩少妇内射浓精videos | 欧美人与禽zoz0性伦交 | 牲欲强的熟妇农村老妇女 | 亚洲一区二区三区四区 | 精品无码一区二区三区的天堂 | 久久国产精品二国产精品 | 午夜福利试看120秒体验区 | 亚洲国产精品久久人人爱 | 人妻aⅴ无码一区二区三区 | 日韩av无码一区二区三区 | 日韩精品乱码av一区二区 | 日韩人妻系列无码专区 | 中文字幕久久久久人妻 | 97夜夜澡人人爽人人喊中国片 | 欧美成人高清在线播放 | www国产亚洲精品久久久日本 | 高潮毛片无遮挡高清免费视频 | 亚洲小说图区综合在线 | 亚洲成av人片在线观看无码不卡 | 无码任你躁久久久久久久 | 国产成人av免费观看 | 色综合久久久无码中文字幕 | 国产情侣作爱视频免费观看 | 国产精品成人av在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 领导边摸边吃奶边做爽在线观看 | 偷窥村妇洗澡毛毛多 | 亚洲中文字幕无码中文字在线 | 青青青爽视频在线观看 | 国产精品毛片一区二区 | 亚洲呦女专区 | 久久综合激激的五月天 | 国产亚洲精品久久久久久 | 天堂亚洲免费视频 | 三级4级全黄60分钟 | 亚洲 日韩 欧美 成人 在线观看 | 国产亚洲精品久久久久久大师 | 精品人妻人人做人人爽 | 亚洲欧洲日本综合aⅴ在线 | 亚洲人成影院在线观看 | 色窝窝无码一区二区三区色欲 | 欧美人与禽zoz0性伦交 | 在线播放免费人成毛片乱码 | 久久久久成人精品免费播放动漫 | 初尝人妻少妇中文字幕 | a国产一区二区免费入口 | 中文字幕乱码亚洲无线三区 | 天堂亚洲2017在线观看 | 网友自拍区视频精品 | 领导边摸边吃奶边做爽在线观看 | 中文字幕乱码人妻二区三区 | 初尝人妻少妇中文字幕 | 成人免费视频一区二区 | 中文亚洲成a人片在线观看 | 97精品国产97久久久久久免费 | 麻豆国产97在线 | 欧洲 | 在线观看免费人成视频 | 欧美日韩亚洲国产精品 | 99久久久国产精品无码免费 | 熟女少妇在线视频播放 | 伊人久久大香线焦av综合影院 | 免费看男女做好爽好硬视频 | 亚洲精品久久久久avwww潮水 | 国产乱子伦视频在线播放 | 熟女俱乐部五十路六十路av | 青青草原综合久久大伊人精品 | 九月婷婷人人澡人人添人人爽 | 色婷婷欧美在线播放内射 | 大乳丰满人妻中文字幕日本 | 亚洲欧洲日本综合aⅴ在线 | 在线a亚洲视频播放在线观看 | 亚洲大尺度无码无码专区 | 蜜桃视频插满18在线观看 | 亚洲高清偷拍一区二区三区 | 人人澡人人妻人人爽人人蜜桃 | 国语自产偷拍精品视频偷 | 娇妻被黑人粗大高潮白浆 | 国产精品高潮呻吟av久久 | 精品日本一区二区三区在线观看 | 精品国产国产综合精品 | 国内丰满熟女出轨videos | 99久久无码一区人妻 | 无码午夜成人1000部免费视频 | 西西人体www44rt大胆高清 | 天堂亚洲免费视频 | 成人免费无码大片a毛片 | 久久亚洲日韩精品一区二区三区 | 欧美怡红院免费全部视频 | 色五月丁香五月综合五月 | 131美女爱做视频 | 久久久中文字幕日本无吗 | 动漫av一区二区在线观看 | 中文字幕乱码人妻无码久久 | 欧美日本免费一区二区三区 | 在线观看国产一区二区三区 | 午夜不卡av免费 一本久久a久久精品vr综合 | 日本欧美一区二区三区乱码 | 亚洲精品综合一区二区三区在线 | 激情人妻另类人妻伦 | 亲嘴扒胸摸屁股激烈网站 | √天堂中文官网8在线 | 国内少妇偷人精品视频免费 | 无码人妻精品一区二区三区不卡 | 免费中文字幕日韩欧美 | 国产极品美女高潮无套在线观看 | 亚洲人亚洲人成电影网站色 | 麻豆果冻传媒2021精品传媒一区下载 | 色五月丁香五月综合五月 | 久久99精品国产麻豆 | 亚洲色偷偷男人的天堂 | 精品国产aⅴ无码一区二区 | 无码福利日韩神码福利片 | 国产乱人无码伦av在线a | 沈阳熟女露脸对白视频 | 一本色道久久综合亚洲精品不卡 | 福利一区二区三区视频在线观看 | 日韩欧美群交p片內射中文 | 老太婆性杂交欧美肥老太 | 人人爽人人澡人人高潮 | 国产av剧情md精品麻豆 | 亚洲色www成人永久网址 | 中文字幕无码免费久久99 | 黑人巨大精品欧美一区二区 | 国产成人精品优优av | 久久午夜夜伦鲁鲁片无码免费 | 国产国产精品人在线视 | 国产9 9在线 | 中文 | 丰满诱人的人妻3 | a片在线免费观看 | 国产精品久久久久久无码 | 国产成人无码av一区二区 | 成人试看120秒体验区 | 国产偷国产偷精品高清尤物 | 东京一本一道一二三区 | 国产在热线精品视频 | 国产精品对白交换视频 | 大色综合色综合网站 | 一区二区三区高清视频一 | 国产卡一卡二卡三 | 男女下面进入的视频免费午夜 | 任你躁在线精品免费 | 亚洲午夜无码久久 | 久9re热视频这里只有精品 | 成人试看120秒体验区 | 丰满妇女强制高潮18xxxx | 亚洲欧美国产精品专区久久 | 久久国产劲爆∧v内射 | 国产精品丝袜黑色高跟鞋 | 国产亲子乱弄免费视频 | 99久久99久久免费精品蜜桃 | √8天堂资源地址中文在线 | 亚洲娇小与黑人巨大交 | 精品久久久无码人妻字幂 | 精品国产一区二区三区av 性色 | 97夜夜澡人人双人人人喊 | 久久国产精品_国产精品 | 欧美性生交xxxxx久久久 | 女人被男人爽到呻吟的视频 | 亚洲精品中文字幕乱码 | 无码av中文字幕免费放 | 亚洲欧美色中文字幕在线 | 亚洲乱码日产精品bd | 亚洲中文字幕av在天堂 | 精品熟女少妇av免费观看 | 中文字幕乱码中文乱码51精品 | 亚洲一区二区三区四区 | 88国产精品欧美一区二区三区 | 日日摸日日碰夜夜爽av | 噜噜噜亚洲色成人网站 | 丰腴饱满的极品熟妇 | 欧洲精品码一区二区三区免费看 | 55夜色66夜色国产精品视频 | 日本高清一区免费中文视频 | 日韩精品久久久肉伦网站 | 国产三级久久久精品麻豆三级 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日日麻批免费40分钟无码 | 色婷婷av一区二区三区之红樱桃 | 西西人体www44rt大胆高清 | 国产无av码在线观看 | 成熟女人特级毛片www免费 | 中文字幕av伊人av无码av | 天天拍夜夜添久久精品大 | 中文字幕人成乱码熟女app | 亚洲中文字幕成人无码 | 久久久久久久女国产乱让韩 | 窝窝午夜理论片影院 | 久久久久久九九精品久 | 六十路熟妇乱子伦 | 久久婷婷五月综合色国产香蕉 | 人人妻人人澡人人爽人人精品浪潮 | 久久亚洲国产成人精品性色 | 久久精品无码一区二区三区 | 综合网日日天干夜夜久久 | 中文字幕av日韩精品一区二区 | а√天堂www在线天堂小说 | 成年美女黄网站色大免费视频 | 国产内射爽爽大片视频社区在线 | 日本大乳高潮视频在线观看 | 日本熟妇人妻xxxxx人hd | 国产性生大片免费观看性 | 国产suv精品一区二区五 | 久久zyz资源站无码中文动漫 | 兔费看少妇性l交大片免费 | 老熟女重囗味hdxx69 | 国产成人无码av一区二区 | 又大又紧又粉嫩18p少妇 | 综合激情五月综合激情五月激情1 | 国产农村妇女高潮大叫 | 又大又硬又黄的免费视频 | 国产后入清纯学生妹 | 久久久精品456亚洲影院 | 国产精品久久久久7777 | 少妇太爽了在线观看 | 久在线观看福利视频 | 麻豆成人精品国产免费 | 亚洲精品国偷拍自产在线麻豆 | 亚洲中文字幕在线无码一区二区 | 久久国产精品萌白酱免费 | 国产激情一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 一本加勒比波多野结衣 | 蜜桃视频插满18在线观看 | 在线亚洲高清揄拍自拍一品区 | 少妇一晚三次一区二区三区 | 欧美午夜特黄aaaaaa片 | 亚洲日韩av片在线观看 | 国产av一区二区三区最新精品 | 国产色视频一区二区三区 | 免费乱码人妻系列无码专区 | 国产精品内射视频免费 | 大乳丰满人妻中文字幕日本 | 人人妻人人澡人人爽人人精品浪潮 | 精品亚洲韩国一区二区三区 | 无码av免费一区二区三区试看 | 国产精品久久久 | 亚洲精品中文字幕久久久久 | 色欲综合久久中文字幕网 | 日产国产精品亚洲系列 | 亚洲精品综合五月久久小说 | 好男人www社区 | 成人免费无码大片a毛片 | 亚洲精品久久久久avwww潮水 | 国产电影无码午夜在线播放 | 鲁鲁鲁爽爽爽在线视频观看 | 无码av中文字幕免费放 | 狂野欧美激情性xxxx | 嫩b人妻精品一区二区三区 | 国产乱码精品一品二品 | 牲欲强的熟妇农村老妇女 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 东京热男人av天堂 | 在线精品国产一区二区三区 | 日本一卡二卡不卡视频查询 | a国产一区二区免费入口 | 日韩人妻无码中文字幕视频 | 小sao货水好多真紧h无码视频 | 亚洲精品成人av在线 | 中文字幕乱码亚洲无线三区 | 波多野结衣 黑人 | 又黄又爽又色的视频 | 成人毛片一区二区 | 精品一区二区三区无码免费视频 | 国产综合色产在线精品 | 99久久人妻精品免费二区 | 超碰97人人射妻 | 男人扒开女人内裤强吻桶进去 | 欧美性色19p | 99久久久国产精品无码免费 | 欧美精品一区二区精品久久 | 97夜夜澡人人爽人人喊中国片 | 日本丰满熟妇videos | 亚洲综合在线一区二区三区 | 精品久久8x国产免费观看 | 亚洲中文字幕在线无码一区二区 | 久久国产精品萌白酱免费 | 男女下面进入的视频免费午夜 | 久久视频在线观看精品 | 日韩在线不卡免费视频一区 | 又粗又大又硬毛片免费看 | 奇米影视7777久久精品 | 六月丁香婷婷色狠狠久久 | 国内综合精品午夜久久资源 | 丝袜美腿亚洲一区二区 | 亚洲天堂2017无码中文 | 国产网红无码精品视频 | 无码免费一区二区三区 | 成人精品一区二区三区中文字幕 | 色欲久久久天天天综合网精品 | 无码国内精品人妻少妇 | 国产suv精品一区二区五 | 国语自产偷拍精品视频偷 | 人妻天天爽夜夜爽一区二区 | 中文字幕日韩精品一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 一区二区三区乱码在线 | 欧洲 | 亚洲熟妇色xxxxx亚洲 | 国产国语老龄妇女a片 | 国产亚洲精品久久久ai换 | 99精品视频在线观看免费 | 一本大道久久东京热无码av | 在线播放亚洲第一字幕 | 亚洲精品国产第一综合99久久 | 又大又黄又粗又爽的免费视频 | 18黄暴禁片在线观看 | 无码乱肉视频免费大全合集 | 亚洲日本va中文字幕 | 伊人久久婷婷五月综合97色 | 亚洲国产精品一区二区第一页 | 亚洲一区二区三区国产精华液 | 人人爽人人澡人人高潮 | 中文字幕无码av波多野吉衣 | 香港三级日本三级妇三级 | 午夜丰满少妇性开放视频 | 国产精品毛多多水多 | 国产日产欧产精品精品app | 无码一区二区三区在线 | 亚洲综合久久一区二区 | 夜夜影院未满十八勿进 | 伊人久久大香线蕉午夜 | 成人性做爰aaa片免费看不忠 | 久久精品国产精品国产精品污 | 国内丰满熟女出轨videos | 日韩欧美成人免费观看 | 免费无码午夜福利片69 | 中文字幕乱码人妻无码久久 | 水蜜桃色314在线观看 | 学生妹亚洲一区二区 | 人妻夜夜爽天天爽三区 | 国产成人精品无码播放 | 日日摸夜夜摸狠狠摸婷婷 | 狠狠色噜噜狠狠狠狠7777米奇 | 日本乱人伦片中文三区 | 亚洲熟女一区二区三区 | 日本丰满护士爆乳xxxx | 无码av中文字幕免费放 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲一区二区三区在线观看网站 | 亚洲欧美精品伊人久久 | 色五月丁香五月综合五月 | 人人妻人人澡人人爽欧美一区九九 | 婷婷综合久久中文字幕蜜桃三电影 | 一本加勒比波多野结衣 | 激情国产av做激情国产爱 | 亚洲成色在线综合网站 | 日日摸夜夜摸狠狠摸婷婷 | 99久久99久久免费精品蜜桃 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲七七久久桃花影院 | 人人妻人人澡人人爽欧美一区九九 | 又大又硬又黄的免费视频 | 欧美老妇交乱视频在线观看 | 天天拍夜夜添久久精品 | 国产在线精品一区二区高清不卡 | 中文久久乱码一区二区 | 国产午夜亚洲精品不卡下载 | 欧美三级a做爰在线观看 | 国产精品久久国产精品99 | 亚洲成av人在线观看网址 | 欧美熟妇另类久久久久久不卡 | 免费网站看v片在线18禁无码 | 清纯唯美经典一区二区 | 小sao货水好多真紧h无码视频 | 亚洲综合伊人久久大杳蕉 | 免费观看激色视频网站 | 欧美人妻一区二区三区 | 中文字幕无码av激情不卡 | a片免费视频在线观看 | 久久人人爽人人人人片 | 日韩精品无码一区二区中文字幕 | aⅴ在线视频男人的天堂 | 67194成是人免费无码 | 国产内射老熟女aaaa | 久久亚洲精品中文字幕无男同 | 国产成人精品优优av | 丰满少妇弄高潮了www | 国产真人无遮挡作爱免费视频 | 伊在人天堂亚洲香蕉精品区 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲精品一区二区三区大桥未久 | 大肉大捧一进一出好爽视频 | 亚洲 另类 在线 欧美 制服 | yw尤物av无码国产在线观看 | 一个人免费观看的www视频 | 丝袜足控一区二区三区 | 乱中年女人伦av三区 | 久久午夜无码鲁丝片 | 少妇无套内谢久久久久 | 午夜精品久久久内射近拍高清 | 日本高清一区免费中文视频 | 国产精品毛片一区二区 | 免费播放一区二区三区 | 欧美xxxx黑人又粗又长 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 成人精品视频一区二区三区尤物 | 欧美老妇交乱视频在线观看 | 香港三级日本三级妇三级 | 麻豆成人精品国产免费 | 久久久精品成人免费观看 | 亚洲第一无码av无码专区 | 日韩人妻少妇一区二区三区 | 九九热爱视频精品 | 无码乱肉视频免费大全合集 | 亚洲色无码一区二区三区 | 欧美熟妇另类久久久久久不卡 | 精品乱子伦一区二区三区 | 日韩亚洲欧美精品综合 | 国产精华av午夜在线观看 | 欧美丰满少妇xxxx性 | 国模大胆一区二区三区 | 国产婷婷色一区二区三区在线 | 荫蒂被男人添的好舒服爽免费视频 | 一个人免费观看的www视频 | 性做久久久久久久免费看 | 领导边摸边吃奶边做爽在线观看 | 久久婷婷五月综合色国产香蕉 | 日韩人妻少妇一区二区三区 | 中文字幕无码日韩欧毛 | 99久久久国产精品无码免费 | 久久午夜无码鲁丝片午夜精品 | 国产精品va在线观看无码 | 国产精品久久久久7777 | 国产精品久久久一区二区三区 | 熟妇激情内射com | 美女极度色诱视频国产 | 伦伦影院午夜理论片 | 亚无码乱人伦一区二区 | 亚洲熟熟妇xxxx | 丰满护士巨好爽好大乳 | 久久伊人色av天堂九九小黄鸭 | 国产午夜福利100集发布 | 精品国产一区二区三区av 性色 | 成人av无码一区二区三区 | 377p欧洲日本亚洲大胆 | 成人性做爰aaa片免费看不忠 | 亚洲人成网站在线播放942 | 76少妇精品导航 | 国产热a欧美热a在线视频 | 久久久精品国产sm最大网站 | 国产成人无码av在线影院 | 精品亚洲韩国一区二区三区 | 99er热精品视频 | 中文字幕精品av一区二区五区 | 一个人免费观看的www视频 | 国精产品一品二品国精品69xx | 日欧一片内射va在线影院 | 色综合久久久无码网中文 | 久久99精品国产麻豆蜜芽 | 九九久久精品国产免费看小说 | 亚洲午夜久久久影院 | 久久久成人毛片无码 | 精品国产麻豆免费人成网站 | 一本色道婷婷久久欧美 | 蜜桃臀无码内射一区二区三区 | 性生交大片免费看l | 中文精品无码中文字幕无码专区 | 76少妇精品导航 | 国产suv精品一区二区五 | 疯狂三人交性欧美 | 99久久久国产精品无码免费 | 大地资源中文第3页 | 一本久道久久综合婷婷五月 | 永久免费精品精品永久-夜色 | 午夜福利不卡在线视频 | 亚洲区欧美区综合区自拍区 | 欧美肥老太牲交大战 | 人人爽人人澡人人人妻 | 永久免费精品精品永久-夜色 | 国产极品美女高潮无套在线观看 | 人妻熟女一区 | 久久伊人色av天堂九九小黄鸭 | 日本护士毛茸茸高潮 | 六月丁香婷婷色狠狠久久 | 国产做国产爱免费视频 | 亚洲国产精品一区二区美利坚 | 欧美精品在线观看 | 久久人人爽人人爽人人片ⅴ | 日韩精品一区二区av在线 | 国产女主播喷水视频在线观看 | 男女下面进入的视频免费午夜 | 久久精品中文字幕大胸 | 国产综合在线观看 | 奇米影视7777久久精品人人爽 | 97资源共享在线视频 | 国产精品久久久久久无码 | 国产亚洲欧美在线专区 | 亚洲色无码一区二区三区 | 久久久中文字幕日本无吗 | 动漫av网站免费观看 | 少妇性l交大片欧洲热妇乱xxx | 两性色午夜视频免费播放 | 久久 国产 尿 小便 嘘嘘 | 国语自产偷拍精品视频偷 | 99久久婷婷国产综合精品青草免费 | 日日摸天天摸爽爽狠狠97 | 国产三级精品三级男人的天堂 | 国产成人无码av片在线观看不卡 | 成人无码精品一区二区三区 | 蜜桃视频插满18在线观看 | 亚洲综合色区中文字幕 | 国产乱人无码伦av在线a | 俺去俺来也在线www色官网 | 小鲜肉自慰网站xnxx | 亚洲国产成人av在线观看 | 亚洲欧洲无卡二区视頻 | 色综合久久久无码网中文 | 在教室伦流澡到高潮hnp视频 | 十八禁视频网站在线观看 | 亚洲天堂2017无码 | 欧洲美熟女乱又伦 | аⅴ资源天堂资源库在线 | 水蜜桃亚洲一二三四在线 | 欧美三级不卡在线观看 | 蜜桃视频韩日免费播放 | 国内老熟妇对白xxxxhd | 久9re热视频这里只有精品 | 午夜精品久久久内射近拍高清 | 成人一在线视频日韩国产 | 人人妻人人澡人人爽欧美一区九九 | 亚洲综合伊人久久大杳蕉 | 2019nv天堂香蕉在线观看 | 玩弄中年熟妇正在播放 | 国产激情无码一区二区 | 清纯唯美经典一区二区 | 动漫av网站免费观看 | 国产精品久久久午夜夜伦鲁鲁 | 四虎国产精品一区二区 | 亚洲欧洲日本综合aⅴ在线 | 亚洲国产av精品一区二区蜜芽 | 亚洲色www成人永久网址 | 丰满人妻精品国产99aⅴ | 国产一区二区三区四区五区加勒比 | 亚洲一区二区三区国产精华液 | 狂野欧美性猛xxxx乱大交 | 久久精品人妻少妇一区二区三区 | 狂野欧美性猛xxxx乱大交 | 网友自拍区视频精品 | 日韩亚洲欧美中文高清在线 | 亚洲精品欧美二区三区中文字幕 | 99精品无人区乱码1区2区3区 | 丰腴饱满的极品熟妇 | 国产亚洲精品久久久久久国模美 | 黄网在线观看免费网站 | 99久久久无码国产aaa精品 | 少妇性俱乐部纵欲狂欢电影 | 国产亚洲欧美在线专区 | 欧美日韩视频无码一区二区三 | 久久精品99久久香蕉国产色戒 | 全球成人中文在线 | 精品久久久久久人妻无码中文字幕 | 免费观看激色视频网站 | 日韩视频 中文字幕 视频一区 | 国产精品久久久久久久9999 | 性生交大片免费看女人按摩摩 | 国产成人无码午夜视频在线观看 | 亚洲国产精品无码一区二区三区 | 无码精品国产va在线观看dvd | 中文字幕无线码免费人妻 | 国产精品国产三级国产专播 | av无码久久久久不卡免费网站 | 亚洲 a v无 码免 费 成 人 a v | 野狼第一精品社区 | 免费人成网站视频在线观看 | 国产精品亚洲五月天高清 | 99精品无人区乱码1区2区3区 | 自拍偷自拍亚洲精品被多人伦好爽 | 乱人伦人妻中文字幕无码久久网 | 国产真人无遮挡作爱免费视频 | 好屌草这里只有精品 | 麻豆精品国产精华精华液好用吗 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日本精品高清一区二区 | 国产亚洲美女精品久久久2020 | 久精品国产欧美亚洲色aⅴ大片 | 奇米影视7777久久精品 | 国产成人一区二区三区在线观看 | 性生交片免费无码看人 | 国产成人无码av片在线观看不卡 | 偷窥村妇洗澡毛毛多 | 色欲久久久天天天综合网精品 | 亚洲国产一区二区三区在线观看 | 国产99久久精品一区二区 | 亚洲一区二区三区香蕉 | 丰满少妇女裸体bbw | 久久久久久亚洲精品a片成人 | 少妇无码av无码专区在线观看 | 亚洲欧美色中文字幕在线 | 亚洲小说春色综合另类 | 九月婷婷人人澡人人添人人爽 | 亚洲 高清 成人 动漫 | 亚洲自偷精品视频自拍 | 国产精品理论片在线观看 | 国产在线精品一区二区高清不卡 | 永久免费观看美女裸体的网站 | 亚洲人成网站免费播放 | 中文字幕色婷婷在线视频 | 国产麻豆精品精东影业av网站 | 76少妇精品导航 | 国产精品a成v人在线播放 | 天堂久久天堂av色综合 | 99精品久久毛片a片 | 国产亚洲精品久久久久久久久动漫 | 精品亚洲韩国一区二区三区 | 色一情一乱一伦一视频免费看 | 国产精品va在线观看无码 | 久久久久久国产精品无码下载 | 国产精品无码一区二区桃花视频 | 国产综合色产在线精品 | 日本xxxx色视频在线观看免费 | 久久熟妇人妻午夜寂寞影院 | 亚洲性无码av中文字幕 | 婷婷色婷婷开心五月四房播播 | 无套内射视频囯产 | 亚洲国产精品久久久天堂 | 乌克兰少妇xxxx做受 | 国内丰满熟女出轨videos | 亚洲小说春色综合另类 | 午夜精品一区二区三区在线观看 | 精品夜夜澡人妻无码av蜜桃 | 无遮挡国产高潮视频免费观看 | 天天av天天av天天透 | 国产亚洲精品久久久久久大师 | 国产亚洲欧美日韩亚洲中文色 | 毛片内射-百度 | 成熟人妻av无码专区 | 99久久久国产精品无码免费 | 十八禁视频网站在线观看 | 久久无码专区国产精品s | 亚洲人成网站色7799 | 欧美大屁股xxxxhd黑色 | 日本www一道久久久免费榴莲 | 国内少妇偷人精品视频免费 | 熟女俱乐部五十路六十路av | 日韩精品成人一区二区三区 | 国产麻豆精品一区二区三区v视界 | 偷窥日本少妇撒尿chinese | 俺去俺来也在线www色官网 | 国产精品久免费的黄网站 | 色婷婷香蕉在线一区二区 | 97精品国产97久久久久久免费 | 成 人 网 站国产免费观看 | 婷婷五月综合激情中文字幕 | 国产九九九九九九九a片 | 精品国产一区二区三区四区在线看 | 亚洲国产成人a精品不卡在线 | 丰满妇女强制高潮18xxxx | 国内精品久久久久久中文字幕 | 国产肉丝袜在线观看 | 女人色极品影院 | 无码帝国www无码专区色综合 | 少妇无码吹潮 | 亚洲高清偷拍一区二区三区 | 国产又爽又黄又刺激的视频 | 日韩成人一区二区三区在线观看 | 中文字幕日产无线码一区 | av无码电影一区二区三区 | 成在人线av无码免观看麻豆 | 中文字幕乱码人妻无码久久 | 沈阳熟女露脸对白视频 | 中文精品久久久久人妻不卡 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 国产亚洲精品久久久久久久久动漫 | 国产偷国产偷精品高清尤物 | 国产一区二区三区影院 | 国产做国产爱免费视频 | 粉嫩少妇内射浓精videos | 国产欧美亚洲精品a | 波多野结衣高清一区二区三区 | 精品国产一区二区三区四区 | 亚欧洲精品在线视频免费观看 | 又粗又大又硬又长又爽 | 亚洲国产高清在线观看视频 | 麻豆精品国产精华精华液好用吗 | 亚洲а∨天堂久久精品2021 | 国产av一区二区三区最新精品 | 久久亚洲日韩精品一区二区三区 | 精品国产精品久久一区免费式 | 中文字幕无码免费久久9一区9 | 国产片av国语在线观看 | 久在线观看福利视频 | 国产精品亚洲一区二区三区喷水 | 日欧一片内射va在线影院 | 人人妻人人澡人人爽精品欧美 | 久久99热只有频精品8 | 色情久久久av熟女人妻网站 | 无码纯肉视频在线观看 | 亚洲国产av精品一区二区蜜芽 | 强伦人妻一区二区三区视频18 | 欧美老妇交乱视频在线观看 | √天堂资源地址中文在线 | www国产亚洲精品久久久日本 | 高中生自慰www网站 | 日韩人妻无码一区二区三区久久99 | 日本在线高清不卡免费播放 | 国产成人人人97超碰超爽8 | aⅴ在线视频男人的天堂 | 国产人妻大战黑人第1集 | 中文久久乱码一区二区 | 久久精品中文闷骚内射 | 精品午夜福利在线观看 | 野外少妇愉情中文字幕 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 真人与拘做受免费视频一 | 撕开奶罩揉吮奶头视频 | 欧美阿v高清资源不卡在线播放 | 国产熟女一区二区三区四区五区 | 亚洲国产成人av在线观看 | 麻豆精品国产精华精华液好用吗 | 日本又色又爽又黄的a片18禁 | 青青久在线视频免费观看 | 亚洲精品午夜无码电影网 | 亚洲一区二区三区四区 | 亚洲欧美综合区丁香五月小说 | 日本护士xxxxhd少妇 | 久久精品国产大片免费观看 | 5858s亚洲色大成网站www | а√资源新版在线天堂 | 精品国产精品久久一区免费式 | 日韩无码专区 | 99久久久无码国产精品免费 | 又色又爽又黄的美女裸体网站 | 人妻插b视频一区二区三区 | 人妻人人添人妻人人爱 | 无套内射视频囯产 | 国产人妻精品午夜福利免费 | 国产另类ts人妖一区二区 | 熟妇激情内射com | 欧美野外疯狂做受xxxx高潮 | 激情亚洲一区国产精品 | 国产亚洲欧美日韩亚洲中文色 | 国产乱码精品一品二品 | 中文精品久久久久人妻不卡 | 玩弄中年熟妇正在播放 | 成人片黄网站色大片免费观看 | 日本免费一区二区三区最新 | 欧美猛少妇色xxxxx | 黑人巨大精品欧美一区二区 | 欧美xxxx黑人又粗又长 | 老头边吃奶边弄进去呻吟 | 在线视频网站www色 | 秋霞特色aa大片 | 久久综合网欧美色妞网 | 国内精品久久久久久中文字幕 | 国产后入清纯学生妹 | 国产国产精品人在线视 | 久久精品人人做人人综合试看 | 国产在线精品一区二区三区直播 | 全球成人中文在线 | 乱中年女人伦av三区 | 欧洲精品码一区二区三区免费看 | 午夜精品久久久久久久 | 成人无码视频在线观看网站 | 亚洲精品无码人妻无码 | 国产97色在线 | 免 | 国产精品自产拍在线观看 | 高清不卡一区二区三区 | 亚洲欧洲日本无在线码 | 无码av最新清无码专区吞精 | 黑森林福利视频导航 | 国产在线精品一区二区高清不卡 | 亚洲色大成网站www国产 | 国产亚洲日韩欧美另类第八页 | 东京无码熟妇人妻av在线网址 | 亚洲一区二区三区在线观看网站 | 少女韩国电视剧在线观看完整 | 久久熟妇人妻午夜寂寞影院 | 中文字幕无码人妻少妇免费 | 亚洲成a人片在线观看日本 | 双乳奶水饱满少妇呻吟 | 77777熟女视频在线观看 а天堂中文在线官网 | 免费无码午夜福利片69 | 一区二区传媒有限公司 | 中文字幕乱码人妻无码久久 | 蜜桃视频插满18在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲精品国产a久久久久久 | 国产精品久久久av久久久 | 欧美人与牲动交xxxx | 国产午夜精品一区二区三区嫩草 | 欧美亚洲国产一区二区三区 | 99在线 | 亚洲 | 樱花草在线社区www | 荡女精品导航 | 成人无码视频在线观看网站 | 国产无遮挡又黄又爽免费视频 | 丰满少妇人妻久久久久久 | 亚洲成色www久久网站 | 国产精品理论片在线观看 | 中文久久乱码一区二区 | 久久久久久久女国产乱让韩 | 久久久久久亚洲精品a片成人 | 久久久av男人的天堂 | 狠狠亚洲超碰狼人久久 | 熟女少妇人妻中文字幕 | 丁香花在线影院观看在线播放 | 成人性做爰aaa片免费看不忠 | 成在人线av无码免费 | 又紧又大又爽精品一区二区 | 亚洲精品午夜无码电影网 | aa片在线观看视频在线播放 | 久久国产劲爆∧v内射 | 成人三级无码视频在线观看 | 在教室伦流澡到高潮hnp视频 | 欧美精品免费观看二区 | 日韩亚洲欧美中文高清在线 | 国产精品欧美成人 | 国产日产欧产精品精品app | 国产综合久久久久鬼色 | 啦啦啦www在线观看免费视频 | ass日本丰满熟妇pics | 亚洲精品成人福利网站 | 又大又硬又黄的免费视频 | 国产精品亚洲五月天高清 | 国产9 9在线 | 中文 | 俄罗斯老熟妇色xxxx | 老熟妇仑乱视频一区二区 | 精品久久久中文字幕人妻 | 免费中文字幕日韩欧美 | 色欲人妻aaaaaaa无码 | 亚洲精品久久久久中文第一幕 | 任你躁国产自任一区二区三区 | 巨爆乳无码视频在线观看 | 激情亚洲一区国产精品 | 久久精品国产一区二区三区 | 国产精品久久久久久久9999 | 成人片黄网站色大片免费观看 | 亚洲精品成a人在线观看 | 国产精品久久久久久亚洲毛片 | 人妻互换免费中文字幕 | 久青草影院在线观看国产 | 久久精品中文字幕大胸 | 岛国片人妻三上悠亚 | 福利一区二区三区视频在线观看 | 国产福利视频一区二区 | 少妇无套内谢久久久久 | 久久精品中文字幕大胸 | 色妞www精品免费视频 | 人人妻人人澡人人爽欧美精品 | 亚洲一区二区三区国产精华液 | 欧美精品无码一区二区三区 | 国产精品久久久久久亚洲影视内衣 | 国产成人无码av片在线观看不卡 | 亚洲成a人片在线观看无码 | 欧美激情一区二区三区成人 | 亚洲乱码国产乱码精品精 | 任你躁国产自任一区二区三区 | 亚洲日本一区二区三区在线 | 成人aaa片一区国产精品 | 黑人玩弄人妻中文在线 | 久久国产精品二国产精品 | 蜜桃av抽搐高潮一区二区 | 免费看少妇作爱视频 | 性色欲网站人妻丰满中文久久不卡 | 国产精品丝袜黑色高跟鞋 | 亚洲乱码中文字幕在线 | 成人亚洲精品久久久久软件 | 中文字幕人妻无码一区二区三区 | 理论片87福利理论电影 | 少妇性俱乐部纵欲狂欢电影 | 婷婷丁香五月天综合东京热 | 亚洲春色在线视频 | 久久午夜无码鲁丝片 | 亚洲精品中文字幕久久久久 | 性色欲情网站iwww九文堂 | 日日噜噜噜噜夜夜爽亚洲精品 | 无码人妻黑人中文字幕 | 亲嘴扒胸摸屁股激烈网站 | 国产免费观看黄av片 | 国产激情无码一区二区app | 麻豆av传媒蜜桃天美传媒 | 国产激情精品一区二区三区 | 激情内射日本一区二区三区 | 亚洲精品中文字幕 | 国产农村妇女高潮大叫 | 青青草原综合久久大伊人精品 | 国产欧美亚洲精品a | 一个人免费观看的www视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久久久免费精品国产 | 国产成人一区二区三区在线观看 | 领导边摸边吃奶边做爽在线观看 | 色五月丁香五月综合五月 | 国产无套内射久久久国产 | 天天燥日日燥 | 久久久无码中文字幕久... | 一本久久a久久精品亚洲 | 成人精品视频一区二区三区尤物 | 亚洲成a人片在线观看无码 | a在线观看免费网站大全 | 一区二区三区乱码在线 | 欧洲 | 国产高潮视频在线观看 | 久久精品人妻少妇一区二区三区 | 一本加勒比波多野结衣 | 中文字幕av伊人av无码av | 免费看男女做好爽好硬视频 | 日韩精品成人一区二区三区 | 美女黄网站人色视频免费国产 | 人妻少妇被猛烈进入中文字幕 | 精品国产一区av天美传媒 | 97资源共享在线视频 | 无套内射视频囯产 | 久久99国产综合精品 | 国产精品人人爽人人做我的可爱 | 1000部啪啪未满十八勿入下载 | 无码国产激情在线观看 | 人人爽人人澡人人高潮 | 荫蒂添的好舒服视频囗交 | 99riav国产精品视频 | 国产极品视觉盛宴 | 中文精品无码中文字幕无码专区 | 精品无码一区二区三区爱欲 | 欧美日本精品一区二区三区 | 国产精品美女久久久久av爽李琼 | 精品国产一区二区三区四区在线看 | а天堂中文在线官网 | 欧洲欧美人成视频在线 | 4hu四虎永久在线观看 | 色婷婷综合中文久久一本 | 真人与拘做受免费视频一 | 亚洲成av人片在线观看无码不卡 | 亚洲乱码日产精品bd | 国产精品-区区久久久狼 | 免费观看黄网站 | 蜜臀aⅴ国产精品久久久国产老师 | 久久www免费人成人片 | 麻豆国产97在线 | 欧洲 | 在线播放无码字幕亚洲 | 亚欧洲精品在线视频免费观看 | 无码一区二区三区在线观看 | 国产片av国语在线观看 | 国产香蕉97碰碰久久人人 | 欧洲欧美人成视频在线 | 波多野结衣高清一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 国产成人精品视频ⅴa片软件竹菊 | 国产精品-区区久久久狼 | 欧美性生交xxxxx久久久 | 国产av人人夜夜澡人人爽麻豆 | 丰满岳乱妇在线观看中字无码 | 蜜桃视频韩日免费播放 | 又大又紧又粉嫩18p少妇 | 思思久久99热只有频精品66 | 无码精品国产va在线观看dvd | 精品久久久无码人妻字幂 | 久久久久se色偷偷亚洲精品av | 亚洲小说春色综合另类 | 国产成人精品视频ⅴa片软件竹菊 | 久久精品人人做人人综合试看 | 久久精品人人做人人综合试看 | 国产三级精品三级男人的天堂 | 男女性色大片免费网站 | 午夜男女很黄的视频 | 性史性农村dvd毛片 | 国产欧美精品一区二区三区 | 成人试看120秒体验区 | 免费无码肉片在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲精品久久久久久一区二区 | 中国女人内谢69xxxxxa片 | 特大黑人娇小亚洲女 | 国产av人人夜夜澡人人爽麻豆 | 女人被男人爽到呻吟的视频 | 国产在线精品一区二区高清不卡 | 欧美老人巨大xxxx做受 | 精品成在人线av无码免费看 | 国产又爽又猛又粗的视频a片 | 波多野结衣高清一区二区三区 | 97久久超碰中文字幕 | 丰满少妇人妻久久久久久 | 亚洲自偷自偷在线制服 | www国产亚洲精品久久网站 | 欧美性猛交xxxx富婆 | 牛和人交xxxx欧美 | 亚洲欧美日韩综合久久久 | av无码久久久久不卡免费网站 | 西西人体www44rt大胆高清 | 久久精品中文字幕大胸 | 女人被男人爽到呻吟的视频 | 激情亚洲一区国产精品 | 一本久道久久综合婷婷五月 | 久久亚洲中文字幕精品一区 | 一本色道久久综合亚洲精品不卡 | 欧美老熟妇乱xxxxx | 日韩av无码一区二区三区不卡 | 日本在线高清不卡免费播放 | 亚洲国产精品毛片av不卡在线 | 最新国产麻豆aⅴ精品无码 | 色爱情人网站 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产一区二区三区日韩精品 | 久久久久久久久蜜桃 | 宝宝好涨水快流出来免费视频 | 性欧美videos高清精品 | 黄网在线观看免费网站 | 精品厕所偷拍各类美女tp嘘嘘 | 呦交小u女精品视频 | 俺去俺来也www色官网 | 午夜精品一区二区三区的区别 | 色婷婷欧美在线播放内射 | 曰韩无码二三区中文字幕 | 青青青手机频在线观看 | 台湾无码一区二区 | 国产精品亚洲综合色区韩国 | 国产精品无套呻吟在线 | 性欧美大战久久久久久久 | 欧美丰满老熟妇xxxxx性 | 免费人成网站视频在线观看 | 亚洲一区二区三区国产精华液 | 亚洲精品国偷拍自产在线麻豆 | 欧美激情内射喷水高潮 | 午夜福利一区二区三区在线观看 | 色欲人妻aaaaaaa无码 | 99在线 | 亚洲 | 领导边摸边吃奶边做爽在线观看 | 成熟女人特级毛片www免费 | 亚洲爆乳大丰满无码专区 | 丰满岳乱妇在线观看中字无码 | 麻豆av传媒蜜桃天美传媒 | 少妇一晚三次一区二区三区 | 日韩无套无码精品 | 内射后入在线观看一区 | 美女黄网站人色视频免费国产 | 国产熟妇高潮叫床视频播放 | 国产 精品 自在自线 | 欧美国产日韩亚洲中文 | 少妇邻居内射在线 | 亚洲欧美色中文字幕在线 | 国产精品资源一区二区 | 精品人妻av区 | 国产精品人人妻人人爽 | 极品尤物被啪到呻吟喷水 | 人人澡人人妻人人爽人人蜜桃 | 国产美女精品一区二区三区 | 小泽玛莉亚一区二区视频在线 | 动漫av一区二区在线观看 | 久久人妻内射无码一区三区 | 精品国产一区av天美传媒 | 欧美日本精品一区二区三区 | av在线亚洲欧洲日产一区二区 | 欧美精品免费观看二区 | 人人妻人人澡人人爽人人精品浪潮 | 久久综合网欧美色妞网 | 国产xxx69麻豆国语对白 | 99久久久国产精品无码免费 | 蜜桃视频韩日免费播放 | aⅴ在线视频男人的天堂 | 97精品人妻一区二区三区香蕉 | 性生交大片免费看女人按摩摩 | 中文字幕av伊人av无码av | 蜜桃无码一区二区三区 | 高清无码午夜福利视频 | 国产真人无遮挡作爱免费视频 | 性欧美熟妇videofreesex | 东京无码熟妇人妻av在线网址 | 无码任你躁久久久久久久 | 亚洲成av人综合在线观看 | 俺去俺来也www色官网 | 国产无套内射久久久国产 | 免费无码av一区二区 | 亚洲欧美国产精品专区久久 | 国产偷国产偷精品高清尤物 | 亚洲一区av无码专区在线观看 | а天堂中文在线官网 | 国产精品视频免费播放 | 久久久久av无码免费网 | 国产真实乱对白精彩久久 | 永久免费观看美女裸体的网站 | 少妇人妻偷人精品无码视频 | 高潮毛片无遮挡高清免费视频 | 正在播放老肥熟妇露脸 | 粉嫩少妇内射浓精videos | 99久久人妻精品免费二区 | 领导边摸边吃奶边做爽在线观看 | 国产成人无码av片在线观看不卡 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲欧美国产精品久久 | 奇米影视7777久久精品人人爽 | 亚洲精品成a人在线观看 | 人人爽人人澡人人人妻 | 亚洲综合精品香蕉久久网 | 久久久久成人片免费观看蜜芽 | 激情亚洲一区国产精品 | 天堂久久天堂av色综合 | 黑人大群体交免费视频 | 一个人看的视频www在线 | 激情综合激情五月俺也去 | 欧美自拍另类欧美综合图片区 | 双乳奶水饱满少妇呻吟 | 美女黄网站人色视频免费国产 | 欧美人与物videos另类 | 日韩精品乱码av一区二区 | 精品无码一区二区三区爱欲 | 成人免费无码大片a毛片 | 一本精品99久久精品77 | 久久久久免费看成人影片 | 久久精品女人天堂av免费观看 | 野外少妇愉情中文字幕 | 99精品国产综合久久久久五月天 | 亚洲人成网站色7799 | 99精品视频在线观看免费 | 亚洲人成网站色7799 | 久久久久久九九精品久 | 麻豆人妻少妇精品无码专区 | 国产精品手机免费 | 国产偷抇久久精品a片69 | 少妇性l交大片 | 理论片87福利理论电影 | 天天摸天天透天天添 | 亚洲小说春色综合另类 | 欧美性生交活xxxxxdddd | 国产精品爱久久久久久久 | 国产做国产爱免费视频 | 亚洲色大成网站www | 扒开双腿疯狂进出爽爽爽视频 | 人人超人人超碰超国产 | 亚洲а∨天堂久久精品2021 | 九九在线中文字幕无码 | 性欧美牲交在线视频 | 亚洲娇小与黑人巨大交 | 国产一精品一av一免费 | 蜜桃无码一区二区三区 | 亚洲国产精品久久久天堂 | 露脸叫床粗话东北少妇 | 欧美精品无码一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 精品aⅴ一区二区三区 | 精品久久久中文字幕人妻 | 国产黄在线观看免费观看不卡 | 婷婷色婷婷开心五月四房播播 | 人妻互换免费中文字幕 | 国产精品内射视频免费 | 欧美日韩综合一区二区三区 | 97精品人妻一区二区三区香蕉 | 国产手机在线αⅴ片无码观看 | 999久久久国产精品消防器材 | 99精品国产综合久久久久五月天 | 成人女人看片免费视频放人 | 国产精品亚洲专区无码不卡 | 国产精品自产拍在线观看 | 精品无码成人片一区二区98 | 又大又硬又黄的免费视频 | 久久国产精品二国产精品 | 国产三级精品三级男人的天堂 | 噜噜噜亚洲色成人网站 | 久久精品丝袜高跟鞋 | a国产一区二区免费入口 | 亚洲乱亚洲乱妇50p | 精品一区二区三区波多野结衣 | 牛和人交xxxx欧美 | 人妻与老人中文字幕 | 疯狂三人交性欧美 | 久在线观看福利视频 | 国产黑色丝袜在线播放 | 亚洲精品鲁一鲁一区二区三区 | 小sao货水好多真紧h无码视频 | 日本精品高清一区二区 | 亚洲男女内射在线播放 | 国产特级毛片aaaaaa高潮流水 | 亚洲va欧美va天堂v国产综合 | 精品水蜜桃久久久久久久 | 亚洲中文字幕av在天堂 | 久久人人97超碰a片精品 | 久久99精品久久久久久 | 国产亚洲美女精品久久久2020 | 国产精品久久久 | 国产精品久久久久7777 | 人妻少妇精品久久 | 麻豆国产人妻欲求不满谁演的 | 天堂а√在线中文在线 | 国产真人无遮挡作爱免费视频 | 中文字幕无码热在线视频 | 18精品久久久无码午夜福利 | 免费中文字幕日韩欧美 | 午夜不卡av免费 一本久久a久久精品vr综合 | 中文字幕人成乱码熟女app | 国产成人精品视频ⅴa片软件竹菊 | 亚洲天堂2017无码中文 | 久久国产精品_国产精品 | 亚洲色成人中文字幕网站 | 午夜精品一区二区三区的区别 | 一本一道久久综合久久 | 国产欧美熟妇另类久久久 | 亚洲精品一区二区三区大桥未久 | 欧美日韩人成综合在线播放 | 亚洲第一网站男人都懂 | 国产精品久久久久无码av色戒 | 国产69精品久久久久app下载 | 日韩精品无码一本二本三本色 | 精品熟女少妇av免费观看 | 日本一卡2卡3卡四卡精品网站 | yw尤物av无码国产在线观看 | 青青草原综合久久大伊人精品 | 精品日本一区二区三区在线观看 | 中文字幕无码日韩欧毛 | 亚洲人成人无码网www国产 | 国产精品自产拍在线观看 | 少妇性l交大片欧洲热妇乱xxx | 国产又爽又黄又刺激的视频 | 亚洲精品一区二区三区四区五区 | 国产成人综合色在线观看网站 | 国产成人午夜福利在线播放 | 真人与拘做受免费视频一 | 亚洲精品无码人妻无码 | 人妻天天爽夜夜爽一区二区 | 欧美高清在线精品一区 | 国产精品igao视频网 | 性欧美疯狂xxxxbbbb | 丰满护士巨好爽好大乳 | 亚洲中文字幕在线观看 | 国产尤物精品视频 | 无码免费一区二区三区 | 国产亚洲人成a在线v网站 | 色婷婷综合激情综在线播放 | 亚洲成av人综合在线观看 | 搡女人真爽免费视频大全 | 久久精品国产日本波多野结衣 | 久久人人97超碰a片精品 | 麻豆蜜桃av蜜臀av色欲av | 精品国产精品久久一区免费式 | 亚洲综合无码一区二区三区 | 欧美人与禽zoz0性伦交 | 成人性做爰aaa片免费看不忠 | 亚洲一区二区三区含羞草 | 亚洲精品久久久久avwww潮水 | 亚洲中文字幕va福利 | 少妇高潮喷潮久久久影院 | 亚洲国产欧美在线成人 | 国产精品第一区揄拍无码 | a在线亚洲男人的天堂 | 黑人粗大猛烈进出高潮视频 | 亚洲s码欧洲m码国产av | 亚洲色www成人永久网址 | 国产精品久久久久久无码 | 国语自产偷拍精品视频偷 | 久久久精品人妻久久影视 | 亚洲成熟女人毛毛耸耸多 | 国产午夜精品一区二区三区嫩草 | 日本丰满熟妇videos | 国产一区二区三区日韩精品 | 在线成人www免费观看视频 | 欧美大屁股xxxxhd黑色 | 国产香蕉97碰碰久久人人 | 国产激情艳情在线看视频 | 色综合久久久无码中文字幕 | 国产两女互慰高潮视频在线观看 | 国产特级毛片aaaaaa高潮流水 | 成 人 免费观看网站 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 国产精品久久久久无码av色戒 | 免费观看激色视频网站 | 国产成人无码av片在线观看不卡 | 精品国产成人一区二区三区 | 无码av免费一区二区三区试看 | 国内揄拍国内精品人妻 | 亚洲人成影院在线无码按摩店 | 成人一在线视频日韩国产 | 午夜无码人妻av大片色欲 | 婷婷综合久久中文字幕蜜桃三电影 | 日韩精品无码一本二本三本色 | 亚洲精品久久久久久久久久久 | 国产无套粉嫩白浆在线 | 无码播放一区二区三区 | 国产精品久久久久无码av色戒 | 久久久久成人精品免费播放动漫 | 久久综合网欧美色妞网 | 久久久久免费精品国产 | 青青青爽视频在线观看 | 成在人线av无码免费 | 国产香蕉97碰碰久久人人 | 99久久无码一区人妻 | 国产高清不卡无码视频 | 红桃av一区二区三区在线无码av | 男人和女人高潮免费网站 | 国产在线精品一区二区高清不卡 | 久久久久久国产精品无码下载 | 伊人久久大香线蕉午夜 | 俺去俺来也在线www色官网 | 中文字幕精品av一区二区五区 | 爽爽影院免费观看 | 亚洲男人av香蕉爽爽爽爽 | 国产内射爽爽大片视频社区在线 | 无码人妻久久一区二区三区不卡 | 日本又色又爽又黄的a片18禁 | 国产偷国产偷精品高清尤物 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲毛片av日韩av无码 | 久久久久免费看成人影片 | 中文字幕 亚洲精品 第1页 | 国产精品久久久久久久9999 | 日韩精品久久久肉伦网站 | 特级做a爰片毛片免费69 | 亚洲小说图区综合在线 | 国产成人无码a区在线观看视频app | 国产超碰人人爽人人做人人添 | 午夜精品久久久内射近拍高清 | 人人澡人摸人人添 | 思思久久99热只有频精品66 | 自拍偷自拍亚洲精品10p | 野外少妇愉情中文字幕 | 亚洲娇小与黑人巨大交 | 亚洲成色在线综合网站 | 中文字幕乱码人妻二区三区 | 男人扒开女人内裤强吻桶进去 | 桃花色综合影院 | 国模大胆一区二区三区 | 伊人久久婷婷五月综合97色 | 国产精品无码久久av | 内射老妇bbwx0c0ck | 亚洲经典千人经典日产 | 久久99热只有频精品8 | 欧美国产亚洲日韩在线二区 | 人妻天天爽夜夜爽一区二区 | 丰满少妇熟乱xxxxx视频 | 成人欧美一区二区三区黑人免费 | 久久人妻内射无码一区三区 | 成人女人看片免费视频放人 | 国产区女主播在线观看 | 又粗又大又硬毛片免费看 | 国产亚洲精品久久久ai换 | 高清不卡一区二区三区 | 又大又黄又粗又爽的免费视频 | 国产精品99久久精品爆乳 | 国产精品久久久久9999小说 | 日韩精品无码一本二本三本色 | 国产麻豆精品一区二区三区v视界 | 国产三级精品三级男人的天堂 | 亚洲日韩乱码中文无码蜜桃臀网站 | 天堂а√在线中文在线 | 亚洲人成影院在线无码按摩店 | 亚洲自偷精品视频自拍 | 久久国产劲爆∧v内射 | 久久精品国产一区二区三区 | 99在线 | 亚洲 | 老子影院午夜伦不卡 | 呦交小u女精品视频 | 99re在线播放 | 在线 国产 欧美 亚洲 天堂 | 亚洲七七久久桃花影院 | 扒开双腿吃奶呻吟做受视频 | 秋霞特色aa大片 | 一本色道久久综合狠狠躁 | 精品国产麻豆免费人成网站 | 国产乱人无码伦av在线a | 亚洲欧洲日本无在线码 | 夜夜高潮次次欢爽av女 | 亚洲国产成人av在线观看 | 国产卡一卡二卡三 | 日韩亚洲欧美精品综合 | 99久久久国产精品无码免费 | 亚洲国产精品一区二区美利坚 | 欧美黑人巨大xxxxx | 亚洲日韩av一区二区三区四区 | 亚洲中文字幕在线无码一区二区 | 国产人妻精品午夜福利免费 | 中文无码精品a∨在线观看不卡 | 亚洲精品成人av在线 | 国产精品怡红院永久免费 | 精品国产一区av天美传媒 | aa片在线观看视频在线播放 | 欧美老人巨大xxxx做受 | 99久久人妻精品免费一区 | 欧美亚洲日韩国产人成在线播放 | 少妇性l交大片欧洲热妇乱xxx | 国产明星裸体无码xxxx视频 | 欧美 日韩 亚洲 在线 | 欧洲熟妇色 欧美 | 亚洲日本va中文字幕 | 麻豆成人精品国产免费 | 国产成人无码区免费内射一片色欲 |