Visitor Pattern的理解

          昨天在一篇Blog上看到提及Visitor Pattern,一下想不起來了,趕快翻閱GOF Design Pattern,看了后似懂非懂,郁悶呀,平時Visitor模式用的比較少,對于pattern最重要的是理解,理解為什么要這么設計我覺得那么在自己應用的時候就容易考慮到一些,去S記pattern是沒什么意義,為了理解visitor模式,按一個場景進行,給部門人員加工資的場景:
          給部門中所有人加工資存在幾種情況,有些是一級的,有些是兩級的
          按照Visitor模式的話也就是訪問部門所有人員并加工資這個作為Visitor,而加一級工資、兩級工資作為Visitable,那么代碼大致如下:

          public interface SalaryVisitor{
                  
          public void addSalary(List allPeoples);
                  
          public void addOneGrade(User user);
                  
          public void addTwoGrade(User user);
          }


          public void SalaryVisitorImpl implements SalaryVisitor{
                  
          public void addSalary(List allPeoples){
                          
          for(Iterator it=allPeoples.iterator();it.hasNext();){
                                   Object obj
          =it.next();
                                   
          if(obj instanceof SalaryVisitable){
                                            ((SaralyVisitable)obj).accept(
          this);
                                   }

                          }

                  }

                  
          public void addOneGrade(Object user){
                            
          // do add one grade salary for this user
                  }

                  
          public void addTwoGrade(Object user){
                            
          // do add two grade salary for this user
                  }

          }


          public interface SaralyVisitable{
                  
          public void accept(SaralyVisitor visitor);
          }


          public class OneGradeSaralyVisitable implements SaralyVisitable{

                  
          public void accept(SaralyVisitor visitor){
                          visitor.addOneGrade(
          this);
                  }


          }


          public class TwoGradeSaralyVisitable implements SaralyVisitable{

                  
          public void accept(SaralyVisitor visitor){
                          visitor.addTwoGrade(
          this);
                  }


          }

          這應該是典型而又傳統的Visitor
          pattern的做法,寫完這段代碼后,基本算是明白了,也就是說分離了對于元素的結構和操作,結構在Visitable中定義標識,而對于元素的操作則交給Visitor負責,這樣在改動的時候都只需改動一方即可,不過我們也可以從上面的代碼中看出Visitor模式的限制,因為在Visitor接口中已經定義了可供使用的操作,也就是說將來要增加操作的話是比較麻煩的,當然,也可以用reflection這樣的方法來解決,^_^,在這只是說明有這個限制,不過Visitor模式對于元素類型不斷增加但元素操作不太改變的應用場景確實有很大的作用,這樣你也就不用在iterator時不斷的去判斷各種各樣的類型然后針對類型采用不同的方法處理,而只用簡單的((Visitable)o).accept(this); 而且可方便你采用各種各樣的Visitor,通過實現Visitor接口改變對于元素的操作,如在上面的例子中我們可以實現一個其他的Visitor,將其中三個方法的實現進行改變,呵呵,那么對于元素的操作也就改變了,這樣也是可以的
          TwoGradeSaralyVisitable ele=new TwoGradeSaralyVisitable();
          ele.accept(
          new OtherSaralyVisitor());
          ^_^,不錯,終于理解了,呵呵,對于pattern的理解能讓你更加靈活的使用pattern

          還是那句話,設計時要注意考慮的是什么是變化的,而什么是相對不變的

          posted on 2005-07-06 09:49 BlueDavy 閱讀(1104) 評論(1)  編輯  收藏 所屬分類: Java

          評論

          # re: Visitor Pattern的理解 2008-08-29 16:38 可可

          切莫誤人子弟 !  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2005年7月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 寿阳县| 博湖县| 云龙县| 永泰县| 航空| 社旗县| 石柱| 德阳市| 昌平区| 垦利县| 林周县| 临夏市| 东辽县| 临邑县| 金门县| 柘荣县| 龙山县| 始兴县| 林州市| 牡丹江市| 常熟市| 黔南| 姚安县| 淮北市| 乐亭县| 称多县| 安远县| 奇台县| 义乌市| 嵩明县| 建德市| 永宁县| 柏乡县| 石城县| 汕尾市| 赫章县| 石嘴山市| 汽车| 阿城市| 安达市| 天长市|