设计模式之Visitor——送礼篇  
               
              今年过年不收礼,收礼只收脑白金。听到这暗示性的广告词,我的脑袋突然一亮。因为最近因为要办某事,必须要给单位的领导要表示一下。到底送什么,还真让人头痛,还好有脑白金,奶奶的。。。,腐败啊,罪过! 
            首先要对送礼的对象进行分析,单位有两个领导,一正,一副。因此给不同的领导送的礼也是不同的(哈,收入要和产出成正比吗),好了言归正传。 
            1、在这里,先把领导定义成一个接口类: 
            public interface Leader{ 
             public void accept(Visitor visitor); //主要任务----收visitor(拜访者)的礼 
            } 
            在把拜访者定义成另一个接口类: 
            public interface Visitor 
            { 
             public void visitFirstHand(FirstHand first); //拜访一把手(带的礼物) 
             public void visitSecondHand(SecondHand second); 
              //拜访二把手(带的礼物) 
             public void visitCollection(Collection collection); 
              //判断是拜访一把手还是二把手 
            } 
            2、下面我们要对这两个接口进行实现: 
            A:一把手 
            public class FirstHand implements Leader { 
             private String value; //注意此处是String 
             public FirstHand (String string) {//一把手的构造函数 
             value = string; 
             } 
              
             public String getValue() { //获得礼物 
             return value; 
             } 
              
            //定义accept的具体内容 这里是很简单的一句调用 
             public void accept(Visitor visitor) { 
             visitor.visitFirstHand (this); //接收拜访人送的礼 
             } 
            } 
            B:二把手 
            public class SecondHand implements Leader { 
             private Float value; //注意此处是Float 
             public SecondHand (Float string) {//二把手的构造函数 
             value = string; 
             } 
              
             public Float getValue() { //获得礼物 
             return value; 
             } 
              
            //定义accept的具体内容 这里是很简单的一句调用 
             public void accept(Visitor visitor) { 
             visitor.visitFirstHand (this); //接收拜访人送的礼 
             } 
            } 
            C:拜访人(我) 
            public class visitMe implements Visitor{ 
              public void visitCollection(Collection collection) 
              { 
             Iterator iterator = collection.iterator(); 
             while (iterator.hasNext()) { 
             Object o = iterator.next(); 
             if (o instanceof Leader) //判断要送给哪个领导 
             ((Leader)o).accept(this); //不同的领导进入不同的实现类 
             } 
             } 
             public void visitFirstHand (FirstHand first) { 
             System.out.println("送的礼是:"+ first.getValue()); 
             } 
             public void visitSecondHand (SecondHand second) 
              { 
             System.out.println("送的礼是:" + second.getValue()); 
             } 
            } 
            3、编写测试类: 
            public class test { 
             public static void main(String args[]){ 
             Visitor visitor = new visitMe (); 
             FirstHand present = new FirstHand ("十盒脑白金"); 
             visitor.visitFirstHand (present); 
              
             Collection list = new ArrayList(); 
             list.add(new FirstHand ("十盒脑白金")); 
             list.add(new SecondHand (new Float("一斤小点心"))); 
              //为了说明不同,如要运行,要做类型转换。 
             visitor.visitCollection(list); 
              
             } 
              
            4、说明: 
            A:代码只用来学习Visitor模式,要运行的话,必须要做一点改动。 
            B:FirstHand,SecondHand只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在accept方法中,在遍历Collection时,通过相应的accept方法调用具体类型的被访问者。这一步确定了被访问者类型 
            C:使用访问者模式是对象群结构中(Collection) 中的对象类型很少改变,也就是说领导很少变化。 
               
             
               
             |