Visitor Pattern的理解

          昨天在一篇Blog上看到提及Visitor Pattern,一下想不起來了,趕快翻閱GOF Design Pattern,看了后似懂非懂,郁悶呀,平時Visitor模式用的比較少,對于pattern最重要的是理解,理解為什么要這么設(shè)計我覺得那么在自己應(yīng)用的時候就容易考慮到一些,去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);
                  }


          }

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

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

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

          評論

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

          切莫誤人子弟 !  回復(fù)  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導(dǎo)航

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

          統(tǒng)計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 凌海市| 盈江县| 尼玛县| 团风县| 牡丹江市| 柳林县| 汕尾市| 华坪县| 安平县| 莆田市| 鲁山县| 福泉市| 泸州市| 玉林市| 郓城县| 松溪县| 长海县| 乌鲁木齐市| 德清县| 朝阳市| 三原县| 日照市| 静安区| 西安市| 松江区| 南充市| 北安市| 汉阴县| 翁牛特旗| 嘉兴市| 六枝特区| 平阳县| 浏阳市| 富蕴县| 池州市| 淮阳县| 蕲春县| 沅陵县| 丹棱县| 布拖县| 峨山|