隨筆-35  評論-97  文章-0  trackbacks-0

          基礎(chǔ)條件

          EMF Model Query Framework 提供了很多方便使用的條件,這些條件實現(xiàn)了用于簡單的數(shù)據(jù)類型斷言。包括strings, numbers, 和 booleans. 這些條件用于模型元素的EAttribute之間所進(jìn)行的邏輯操作.。

          看看這些條件結(jié)構(gòu):

          從結(jié)構(gòu)圖上可以看出,Condition是最為條件的最頂層父類,它能作各種條件的邏輯操作,AND、OR等,說明條件是可以復(fù)合的。而且,Comdition類依賴ConditionPolicy的依賴使得條件能滿足全匹配(ALL)或者任意匹配(ANY)的策略。

          Condition三個子類CompoundCondition(復(fù)合條件),Not(非條件)和ObjectInstanceCondition(對象實例條件)

          很容易也看出,CompoundCondition的子類都是一些有關(guān)復(fù)合的條件類。這些都是可以進(jìn)行邏輯上的復(fù)合的。

          注意到Implies(蘊含),在數(shù)學(xué)上蘊含是有這樣的規(guī)則:當(dāng)?shù)谝粋€表達(dá)式為真,且第二個表達(dá)式為假時,結(jié)果為假,否則為真。記住哦,否則很容易搞錯的。特別是在條件進(jìn)行復(fù)合時運用蘊含操作,要認(rèn)真分析前后的表達(dá)式。

          簡單條件類型

          看看下面的結(jié)構(gòu)圖就知道條件是如何與簡單類型進(jìn)行匹配:

          可以很容易看出,這些其實都是一些值類型條件,只是有些條件作了一些擴展的匹配功能,比如字符串條件可以不但可以從字符串內(nèi)容上(包括子串和正則表達(dá)式匹配),還可一從字符長度上匹配。

          下面來舉一些使用例子來看看條件是如果匹配的。

           

          public static void queryExample1()
              
          {
                  Object subject 
          = 100d; 
                  Condition a 
          = new NumberCondition.DoubleValue(10.0d,1000.0d);  //是否在100-1000的double內(nèi)
                  System.out.println("100 是否在10-1000范圍? " + a.isSatisfied(subject));
                  
                  Condition b 
          = new BooleanCondition(false);
                  System.out.println(
          "true 是否滿足false條件? " + b.isSatisfied(true));
                  
                  Condition c 
          = new StringValue("EMF-Query"truenew StringAdapter(){
                      
          public String getString(Object object)
                      
          {
                          
          return object.toString();
                      }

                  }
          );
                  System.out.println(
          "“EMF-Query” 是否滿足c條件?" + c.isSatisfied("emf-query"));
                  
                  Condition a1 
          = new NumberCondition.DoubleValue(10.0d,15.0d);  //是否在100-1000的double內(nèi)
                  Condition a2 = new NumberCondition.DoubleValue(108d,1000.0d);  //是否在100-1000的double內(nèi)
                  
          //蘊含:當(dāng)?shù)谝粋€表達(dá)式為真,且第二個表達(dá)式為假時,結(jié)果為假,否則為真。
                  Condition complex = a.IMPLIES(a1.OR(a2));//
                  System.out.println("復(fù)合條件測試:" + complex.isSatisfied(subject));
                  
                  StringCondition cond 
          = new StringRegularExpressionValue("A+");
                  System.out.println(
          "正則表達(dá)式測試:" + cond.isSatisfied("CATGGTGCCAC"));
                  
                  Collection subjects 
          = new ArrayList(); //多個將要匹配的主題
                  subjects.add(100d);
                  subjects.add(200d);
                  subjects.add(209d);
                  subjects.add(2000d);
                  Condition  interzone
          = new NumberCondition.DoubleValue(100.0d,1000.0d);
                  
          //全匹配策略
                  System.out.println("全匹配策略: " + ConditionPolicy.ALL.isSatisfied(interzone, subjects));
                  
          //任意匹配策略
                  System.out.println("任意匹配策略: " + ConditionPolicy.ANY.isSatisfied(interzone, subjects));
              }

          例子很簡單,不需要再作太多的說明了吧。想提提的就是條件一般是用這個condition.isSatisfied(subject) 方法來匹配的。ObjectInstanceCondition留到后面的例子吧。看看輸出的結(jié)果:

          100 是否在10-1000范圍? true
          true 是否滿足false條件? false
          “EMF
          -Query”是否滿足c條件?false
          復(fù)合條件測試:
          false
          正則表達(dá)式測試:
          true
          全匹配策略: 
          false
          任意匹配策略: 
          true
          posted on 2007-06-10 03:37 三告習(xí)習(xí) 閱讀(1175) 評論(0)  編輯  收藏 所屬分類: emf/gef/gmf
          主站蜘蛛池模板: 宜州市| 海口市| 玉门市| 青龙| 双峰县| 榕江县| 石泉县| 加查县| 沙坪坝区| 永嘉县| 石狮市| 博客| 千阳县| 胶州市| 武强县| 岑溪市| 故城县| 偃师市| 区。| 广德县| 岑巩县| 龙泉市| 桃园市| 绥中县| 越西县| 泽库县| 偏关县| 普兰店市| 临湘市| 永登县| 平利县| 广河县| 鄯善县| 叶城县| 白水县| 平果县| 漳州市| 方山县| 文水县| 潞西市| 清丰县|