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 阅读(1099) 评论(1)  编辑  收藏 所属分类: Java

评论

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

切莫误人子弟 !  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

公告

 









feedsky
抓虾
google reader
鲜果

导航

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

统计

随笔分类

随笔档案

文章档案

Blogger's

搜索

最新评论

阅读排行榜

评论排行榜