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.
分享到:
相关推荐
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...
**C++ Visitor模式详解** Visitor模式是设计模式中的一种行为模式,它在对象结构中引入了一个访问者角色,使得访问者能够对结构中的每个元素进行操作,而不改变元素本身的行为。这种模式允许我们在不修改已有类的...
本项目基于“visitor模式”和“访问者模式”,实现了用于计算表达式的求值引擎,这涉及到一种将数学表达式转化为数据结构(表达式树)的方法,然后通过遍历该树来执行计算。下面我们将详细探讨这些概念。 1. **...
在编程领域,访问者模式常用于代码生成器、格式化工具、语法解析器等场景。例如,一个HTML解析器可能使用访问者模式来遍历HTML文档结构,并对每个元素进行不同的处理,如提取文本、转换样式或生成DOM树。 **实际...
也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。
### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...
"设计模式系列之visitor"是一个关于软件设计模式的讨论,特别是关注于“访问者”(Visitor)模式。这个模式是GOF(Gamma, Helm, Johnson, Vlissides)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出...
**访问者模式(Visitor)详解** 访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时...
**访问者模式(VisitorPattern)** 访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问...
**C#设计模式之Visitor** **一、设计模式概述** 设计模式是软件开发中的经验总结,它提供了解决常见问题的可复用解决方案。在C#编程中,设计模式可以帮助我们编写更灵活、可扩展和易于维护的代码。"Visitor"(访问...
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
8. **Visitor模式**:访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。在C++中,可以通过定义访问者接口和具体的访问者类来实现。 9. **...
rust中当然也可以有visitor模式这样的东西,比如
**访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...
### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...
Java 的双重分发与 Visitor 模式实例详解 Java 中的双重分发(Double Dispatch)是一种机制,允许在运行时确定方法的调用,而不仅仅是根据方法的接收者,还受参数类型的决定。这种机制可以实现面向对象的多态。 在...