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è)計時要注意考慮的是什么是變化的,而什么是相對不變的
給部門中所有人加工資存在幾種情況,有些是一級的,有些是兩級的
按照Visitor模式的話也就是訪問部門所有人員并加工資這個


































































這應(yīng)該是典型而又傳統(tǒng)的Visitor
pattern的做法,寫完這段代碼后,基本算是明白了


還是那句話,設(shè)計時要注意考慮的是什么是變化的,而什么是相對不變的
posted on 2005-07-06 09:49 BlueDavy 閱讀(1104) 評論(1) 編輯 收藏 所屬分類: Java