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.
分享到:
相关推荐
8. **Visitor模式**:访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。在C++中,可以通过定义访问者接口和具体的访问者类来实现。 9. **...
16. **访问者模式(Visitor)**:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 17. **状态模式(State)**:允许对象在其内部状态改变时改变其行为,...
11. 访问者模式(Visitor):定义一个访问的运算接口,作用于一系列的对象集合上,且允许增加作用于这些对象的新操作,而无需改变这些对象的类。 这份新版设计模式手册由李会军以C#语言进行阐述,适合有一定编程...
本教程以通俗易懂的方式讲解了这些模式,使初学者也能快速掌握。 首先,我们要理解设计模式的基本概念。设计模式不是直接可以使用的代码库,而是经验总结,是对常见问题的最佳实践描述。在C++中,设计模式主要分为...
设计模式之 Visitor(访问者) 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展. 设计模式引言 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难。你必须找到相关的对象,以适当的粒度将...
设计模式是在软件设计过程中针对常见问题而提出的标准化解决方案。这些模式有助于开发人员编写出更易于理解、维护和扩展的代码。通过学习并掌握设计模式,开发人员可以提高工作效率,减少代码冗余,并提升软件的整体...
18. **访问者模式(VisitorPattern)**:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 19. **状态模式(StatePattern)**:允许一个对象在其内部...
如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、备忘录模式(Memento)、状态模式(State)、访问者模式(Visitor)、解释器...