久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Drools規(guī)則引擎之WorkingMemory

 只要樂一樂 2010-03-01
1 Facts
Facts 是從你的應(yīng)用中,被 assert 進(jìn) WorkingMemory 中的對象( beans )。 Facts 是規(guī)則可以訪問的任意的 java 對象。規(guī)則引擎中的 facts 并不是“ clone ” facts ,,它只是持有到你的應(yīng)用中數(shù)據(jù)的引用。 Facts 是你的應(yīng)用數(shù)據(jù),。 String 和其他沒有 getter 和 setter 的類不是有效的 Fact ,。這樣的類不能使用域約束( Field Constraints ),因?yàn)槭褂糜蚣s束要依靠 JavaBean 標(biāo)準(zhǔn)的 getter 和 setter 來同對象交互,。
2 Assertion
“Assertion” 是將 facts 告訴 WorkingMemory 的動(dòng)作,,例如 WorkingMemory.assertObject (yourObject) 。當(dāng)你 assert 一個(gè) fact ,,它將被檢查是否匹配規(guī)則,。這意味著所有的匹配工作將會(huì)在 assert 的過程中完成。盡管如此,,當(dāng)你完成 assert facts 之后,,你還要調(diào)用“ fireAllRules() ”方法來執(zhí)行規(guī)則。
當(dāng)一個(gè)對象被 assert 后,會(huì)返回一個(gè) FactHandle ,。這個(gè) FactHandle 是一個(gè)代表在 Working Memory 中你的 asserted Object 的令牌( token ),。當(dāng)你希望 retract 或者 modify 一個(gè)對象的時(shí)候,這個(gè)令牌讓你用來同 WorkingMemory 進(jìn)行交互,。
Cheese stilton = new Cheese( " stilton " );
FactHandle stiltonHandle
=
workingMemory.assertObject( stilton );

WorkingMeomry 有兩種 assertion 模式: Equality 和 Identity (默認(rèn)是 Identity ),。
Identity 模式下 WorkingMemory 使用一個(gè) IdentityHashMap 來存儲(chǔ)所有的 asserted Objects 。這個(gè)模式下,,當(dāng) asserted 的 Object 是同一個(gè)實(shí)例時(shí),,它返回同一個(gè) FactHandle 。
Equality 模式下 WorkingMemory 使用一個(gè) HashMap 來存儲(chǔ)所有的 asserted Objects ,。這個(gè)模式下,,當(dāng) asserted 的 Object 相等時(shí),它返回同一個(gè) FactHandle ,。
( WorkingMemory.assertObject(yourObjcet) 只是進(jìn)行 assertion 的一種 regular 方法,,還存在有一種稱為 logical assertion 的動(dòng)作)。
3 Retraction
基本上就是 assert 的逆操作,。當(dāng)你 retract 一個(gè) fact ,, WorkingMemory 將不再跟蹤那個(gè) fact 。任何被 activated 并依賴那個(gè) fact 的規(guī)則將被取消,。注意:完全有可能存在某條規(guī)則是依賴于一個(gè) fact 的“不存在”( non existence ),。在這種情況下, retract 一個(gè) fact 將導(dǎo)致一條規(guī)則被激活,。對一個(gè) Fact 進(jìn)行 Retraction ,,必須用 assert 時(shí)返回的那個(gè) FactHandle 做為參數(shù)。
Cheese stilton = new Cheese( " stilton " );
FactHandle stiltonHandle
=
workingMemory.assertObject( stilton );
.
workingMemory.retractObject( stiltonHandle );

4 Modification
當(dāng)一個(gè) Fact 被修改了,,會(huì)通知規(guī)則引擎進(jìn)行重新處理,。在規(guī)則引擎內(nèi)部實(shí)際上是對舊的 Fact 進(jìn)行 retract ,然后對新的 Object 再進(jìn)行 assert ,。要使用 modifyObject() 方法來通知 Working Memory ,,被改變的 Object 并不會(huì)自己通知規(guī)則引擎。注意: modifyObject() 方法總是要把被修改的 Object 做為第二參數(shù),,這就允許你把一個(gè)不可變對象替換為另一個(gè)新對象,。
Cheese stilton = new Cheese( " stilton " );
FactHandle stiltonHandle
=
workingMemory.assertObject( stilton );
.
stilton.setPrice(
100
);
workingMemory.modifyObject( stiltonHandle, stilton );

5 Globals
Global 是一個(gè)能夠被傳進(jìn) WorkingMemory 但不需要 assert 的命名對象。大多數(shù)這些對象被用來作為靜態(tài)信息或服務(wù),。這些服務(wù)被用在一條規(guī)則的 RHS ,,或者可能是從規(guī)則引擎返回對象的一種方法。
List list = new ArrayList();
workingMemory.setGlobal(
" list "
, list);

setGlobal() 方法傳進(jìn)去的命名對象必須同 RuleBase 中所定義的具有相同的類型(就是要同你的規(guī)則文件中用 Global 關(guān)鍵字所定義的類型相同),,否則會(huì)拋出一個(gè) RuntimeException ,。如果一條規(guī)則在你 setGlobal 之前調(diào)用了定義的 Global ,,會(huì)拋出一個(gè) NullPointerException 。
6 Property Change Listener
如果你的 fact 對象是 JavaBean ,,你可以為它們實(shí)現(xiàn)一個(gè) property change listener ,,然后把它告訴規(guī)則引擎。這意味著,,當(dāng)一個(gè) fact 改變時(shí),,規(guī)則引擎將會(huì)自動(dòng)知道,并進(jìn)行響應(yīng)的動(dòng)作(你不需要調(diào)用 modifyObject() 方法來通知 WorkingMemory ),。 Proxy libraries 將會(huì)幫助實(shí)現(xiàn)這一切,。要讓 Property Change Listener 生效,還要將 fact 設(shè)置為動(dòng)態(tài)( dynamic )模式,,通過將 true 做為 assertObject() 方法的第二個(gè)參數(shù)來實(shí)現(xiàn):
Cheese stilton = new Cheese( " stilton " );
FactHandle stiltonHandle
= workingMemory.assertObject( stilton, true );   // specifies t
hat this is a dynamic fact

然后要在 JavaBean 中加入一個(gè) PropertyChangeSupport 實(shí)例,,和兩個(gè)方法: addPropertyChangeListener() 和 removePropertyChangeListener() 。最后要在 JavaBean 的 setter 方法中通知 PropertyChangeSupport 所發(fā)生的變化,。示例代碼如下:
private final PropertyChangeSupport changes = new PropertyChangeSupport( this );

public void addPropertyChangeListener( final
PropertyChangeListener l) {
    
this
.changes.addPropertyChangeListener( l );
}

public void removePropertyChangeListener( final
PropertyChangeListener l) {
    
this
.changes.removePropertyChangeListener( l );
}

public void setState( final
String newState) {
     String oldState
= this
.state;
    
this .state =
newState;
this .changes.firePropertyChange( " state "
, oldState, newState );

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多