zoukankan      html  css  js  c++  java
  • drools5工作流实例--猜数字

    *.java

    package com.sample;

    public class NumGuessMain
    {

    public static void main(String[] args)
    {
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newClassPathResource("NumGuess.drl"), ResourceType.DRL);
    kbuilder.add(ResourceFactory.newClassPathResource("NumGuess.rf"), ResourceType.DRF);
    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
    StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
    GameRules gr = new GameRules();
    gr.setMaxRange(100);
    gr.setAllowedGuesses(6);
    ksession.insert(gr);
    ksession.insert(new RandomNumber());
    ksession.insert(new Game());
    ksession.startProcess("Number Guess");
    ksession.fireAllRules();
    ksession.dispose();
    }

    }

    public class Game
    {
    private int biggest;
    private int smallest;
    private int guessCount;
    public Game()
    {
    this.biggest = 0;
    this.smallest = 100;
    this.guessCount = 0;
    }
    public void incrementGuessCount()
    {
    this.guessCount++;
    }
    public int getBiggest()
    {
    return biggest;
    }
    public void setBiggest(int biggest)
    {
    this.biggest = biggest;
    }
    public int getSmallest()
    {
    return smallest;
    }
    public void setSmallest(int smallest)
    {
    this.smallest = smallest;
    }
    public int getGuessCount()
    {
    return guessCount;
    }
    public void setGuessCount(int guessCount)
    {
    this.guessCount = guessCount;
    }
    }

    public class GameRules
    {
    private int maxRange;
    private int allowedGuesses;
    public int getMaxRange()
    {
    return maxRange;
    }
    public void setMaxRange(int maxRange)
    {
    this.maxRange = maxRange;
    }
    public int getAllowedGuesses()
    {
    return allowedGuesses;
    }
    public void setAllowedGuesses(int allowedGuesses)
    {
    this.allowedGuesses = allowedGuesses;
    }
    public static boolean isNumber(String s)
    {
    try {
    Integer.parseInt(s);
    return true;
    } catch (Exception e) {
    return false;
    }
    }
    }

    public class Guess
    {
    private int value;
    public Guess(int value)
    {
    this.value = value;
    }
    public int getValue()
    {
    return value;
    }
    public void setValue(int value)
    {
    this.value = value;
    }
    public String toString()
    {
    return "Guess " + this.value;
    }
    }

    public class RandomNumber
    {
    private int value;
    public RandomNumber()
    {
    this.value = new Random().nextInt(100);
    }
    public int getValue()
    {
    return value;
    }
    public void setValue(int value)
    {
    this.value = value;
    }
    }

    NumGuess.drl

    package com.sample
    dialect "mvel"
    import java.io.InputStreamReader;
    import java.io.BufferedReader;
    rule "Get User Guess"
    ruleflow-group "Guess"
    no-loop true
    when
    $r:RandomNumber()
    rules:GameRules(allowed:allowedGuesses)
    game:Game(guessCount<allowed)
    not (Guess())
    then
    System.out.println("you have "+(rules.getAllowedGuesses()-game.getGuessCount())+" out of "+rules.getAllowedGuesses()+" guesses left. please enter your guess from 0 to "+rules.getMaxRange());
    br=new BufferedReader(new InputStreamReader(System.in));
    s=br.readLine();
    i=GameRules.isNumber(s)?(new Integer(s)):0;
    modify(game){guessCount+=1}
    insert(new Guess(i));
    end
    rule "Record the biggest Guess"
    ruleflow-group "Guess"
    no-loop true
    when
    game:Game(biggestGuess:biggest)
    Guess($value:value>biggestGuess)
    then
    modify(game){biggest=$value}
    end
    rule "Record the smallest Guess"
    ruleflow-group "Guess"
    no-loop true
    when
    game:Game(small:smallest)
    Guess($val:value<small)
    then
    modify(game){smallest=$val}
    end
    rule "Guess incorrect, retract Guess"
    ruleflow-group "Guess incorrect"
    when
    guess:Guess()
    then
    retract(guess);
    end
    rule "No more Guesses notification"
    ruleflow-group "No more guesses"
    when
    r:RandomNumber()
    game:Game()
    then
    System.out.println(" you have no more guesses the correct guess was "+r.value);
    System.out.println("your smallest guess was "+game.smallest+" your biggest guess was "+game.biggest);
    end

    NumGuess.rf

    <?xml version="1.0" encoding="UTF-8"?>
    <process xmlns="http://drools.org/drools-5.0/process"
    xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
    xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
    type="RuleFlow" name="Number Guess" id="Number Guess" package-name="com.sample" >

    <header>
    <imports>
    <import name="com.sample.Game" />
    <import name="com.sample.GameRules" />
    <import name="com.sample.Guess" />
    <import name="com.sample.RandomNumber" />
    </imports>
    </header>

    <nodes>
    <start id="1" name="Start" x="67" y="88" width="49" height="49" />
    <end id="2" name="End" x="476" y="462" width="48" height="48" />
    <join id="3" name="More guesses Join" x="69" y="174" width="145" height="49" type="2" />
    <ruleSet id="4" name="Guess" ruleFlowGroup="Guess" x="48" y="285" width="80" height="49" />
    <actionNode id="5" name="Guess correct" x="209" y="368" width="121" height="48" >
    <action type="expression" dialect="mvel" >System.out.println( "You guessed correctly" );</action>
    </actionNode>
    <actionNode id="6" name="Too high" x="33" y="515" width="121" height="48" >
    <action type="expression" dialect="mvel" >System.out.println( "Your guess was too high" );</action>
    </actionNode>
    <actionNode id="7" name="Too low" x="210" y="454" width="121" height="48" >
    <action type="expression" dialect="mvel" >System.out.println( "Your guess was too low" );</action>
    </actionNode>
    <ruleSet id="8" name="No more guesses" ruleFlowGroup="No more guesses" x="425" y="292" width="145" height="49" />
    <ruleSet id="9" name="Guess incorrect" ruleFlowGroup="Guess incorrect" x="606" y="514" width="125" height="48" />
    <split id="10" name="Guess correct?" x="64" y="376" width="49" height="49" type="2" >
    <constraints>
    <constraint toNodeId="7" toType="DROOLS_DEFAULT" name="too low" priority="1" type="rule" dialect="mvel">
    RandomNumber(val:value)
    Guess(value &lt; val)
    </constraint>
    <constraint toNodeId="6" toType="DROOLS_DEFAULT" name="too high" priority="1" type="rule" dialect="mvel">
    RandomNumber(val:value)
    Guess(value &gt; val)
    </constraint>
    <constraint toNodeId="5" toType="DROOLS_DEFAULT" name="correct" priority="1" type="rule" dialect="mvel">
    RandomNumber(val:value)
    Guess(value == val)
    </constraint>
    </constraints>
    </split>
    <join id="11" name="Gateway" x="427" y="513" width="49" height="49" type="2" />
    <split id="12" name="More Guesses?" x="634" y="159" width="49" height="49" type="2" >
    <constraints>
    <constraint toNodeId="8" toType="DROOLS_DEFAULT" name="no more guesses" priority="1" type="rule" dialect="mvel">
    GameRules(allowed:allowedGuesses)
    Game(guessCount &gt;= allowed)
    </constraint>
    <constraint toNodeId="3" toType="DROOLS_DEFAULT" name="more guesses" priority="1" type="rule" dialect="mvel">
    GameRules(allowed:allowedGuesses)
    Game(guessCount &lt; allowed)
    </constraint>
    </constraints>
    </split>
    <join id="13" name="Gateway" x="474" y="381" width="49" height="49" type="2" />
    </nodes>

    <connections>
    <connection from="13" to="2" />
    <connection from="1" to="3" />
    <connection from="12" to="3" />
    <connection from="3" to="4" />
    <connection from="10" to="5" />
    <connection from="10" to="6" />
    <connection from="10" to="7" />
    <connection from="12" to="8" />
    <connection from="11" to="9" />
    <connection from="4" to="10" />
    <connection from="6" to="11" />
    <connection from="7" to="11" />
    <connection from="9" to="12" />
    <connection from="5" to="13" />
    <connection from="8" to="13" />
    </connections>

    </process>

  • 相关阅读:
    封装好的AFN网络请求框架和MBProgress
    iOS定时器的使用
    iOS去除导航栏和tabbar的1px横线
    移动端加解密
    改变字符串中部分字符传的字体大小和颜色
    关于NSLog
    ipad开发:二维码扫描,摄像头旋转角度问题解决办法
    iOS-图文表并茂,手把手教你GCD
    计算富文本的高度
    jsp打印
  • 原文地址:https://www.cnblogs.com/feilv/p/4126633.html
Copyright © 2011-2022 走看看