`
Mybeautiful
  • 浏览: 294364 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Visitor模式通俗化

阅读更多

      23种设计模式中,最难理解的可能就是Visitor, 而难理解的主要原因却又有相当的原因是不知道什么时候要用它,貌似它把问题搞复杂了。我一直不太能真正的领会它,直到最近的项目中我无意中用到,然后一对比,发现就是Visitor模式,只是没有把Visitor抽象成接口。

       面向对象中很重要的一条是是抽象,那为什么要抽象呢?其根本原因是为了解耦,而其直接原因是为了把“可变的和不变的分离。”Visitor模式也是为了要把“可变的和不变的分离”。具体而言,被访问者是不变的,而访问者是可变的。举个例子来说,我张瑜是不变的,而不同的人看我会有不同的眼光,这个看我的眼光是可变的。接下来我们用一个详细的例子来说明这个问题。

       我们公司有三个人,张三,李四,王五 (三个历史名人,谁都听说过,但谁都不知道是谁),其定义如下,


//三个人都是公司精英,都愿意接受公司领导考核。
public interface Talent{
   public String getName();
   public void accept(PerformanceVisitor visitor);
}


class 张三 implements Talent{
   public String getName(){
        return "张三";
   }
   public void accept(PerformanceVisitor visitor){
        visitor.visit(this);
        //张三其他汇报事项。
   }
}

class 李四 implements Talent{
   public String getName(){
        return "李四";
   }

   public void accept(PerformanceVisitor visitor){
        visitor.visit(this);
        //李四其他汇报事项。
   }
}

class 王五 implements Talent{
   public String getName(){
        return "王五";
   }
   public void accept(PerformanceVisitor visitor){
        visitor.visit(this);
        //王五其他汇报事项。
   }
}
 

 


      这三个兄弟是公司老员工了,所以是不变的;现在的问题是,公司各级领导对他们每个人都有不同的个人看法。就拿两个领导说吧,晁某,宋某。他们都可以 给张山,李四,王五,打绩效,所以先把打绩效这个事抽象出来,



//注意这就是定义Visitor了,
public interface PerformanceVisitor{
    public void visit(张三 zhangsan);
    public void visit(李四 lisi);
    public void visit(王五 wangwu);
}
 

 



      晁头领跟宋头领都可以给三人打绩效,分别是这样操作的,

public class 晁头领Visitor implements PerformanceVisitor{
    public void visit(张三 zhangsan){
        System.out.println("张三是个好同志");
    }
    public void visit(李四 lisi){
        System.out.println("李四兄弟需要多加努力啊!");
    }
    public void visit(王五 wangwu){
        System.out.println("莫天天上班睡觉!!");
    }
}

public class 宋头领Visitor implements PerformanceVisitor{
    public void visit(张三 zhangsan){
        System.out.println("张三前途无量,是我宋某的人。");
    }
    public void visit(李四 lisi){
        System.out.println("你这黑厮想造反啊?");
    }
    public void visit(王五 wangwu){
        System.out.println("新来的么?");
    }
}
 

 


     又一年年终考核时间到了,考核开始,

public class Kaohe {
   public static void main(String[] argv){
      List<Talent> talents= new ArrayList<Talent> ();
      talents.add(new 张三());
      talents.add(new 李四());
      talents.add(new 王五());
      //前面先把三人集中到会议室,
      //晁头领先打分
      PerformanceVisitor  晁盖 =new 晁头领Visitor();
      for(Talent t: talents){
           t.accept(晁盖);
      }

      //轮到宋头领打分
      PerformanceVisitor  宋江 =new 宋头领Visitor();
      for(Talent t: talents){
           t.accept(宋江);
      }
   } 
}
 

 


     各位看客,是否对晁宋二头领的评价标准有一定的了解了呢?对Visitor模式也有更加深入的认识了呢?

----------------------------------------------------------------------

张瑜,Mybeautiful, zhangyu0182@sina.com.

2
3
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics