`
shaucle
  • 浏览: 21528 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

谁说visitor不可以添加新元素?

阅读更多


这个visitor就可以随便添加,利用反射就可以做到了.
public abstract class Visitor {

    final public void visit(Object object) {
        Method method = getVisitMethod(object);
        try {
            method.invoke(this, new Object[] { object });
        } catch (Exception e) {
            String message = "invokeing method failed:visit("
                    + object.getClass().getName() + ")";
            throw new RuntimeException(message, e);
        }
    }

    private Map visitMethods = new HashMap();

    private Method getVisitMethod(Object object) {
        //return (Method) visitMethods.get(object.getClass());
        Iterator it = visitMethods.keySet().iterator();
        for (; it.hasNext();) {
            Class clazz = (Class) it.next();
            if (clazz.isAssignableFrom(object.getClass())) {
                return (Method) visitMethods.get(clazz);
            }
        }
        throw new RuntimeException("method: visit(" + object.getClass().getName()
                + ") undefined in the class");
    }

    private Method visitMethod;

    private void initVisitMethod() {
        Method[] methods = getClass().getDeclaredMethods();
        for (int i = 0; i < methods.length; i++) {
            if (methods[i].getName().equals("visit")) {
                Class[] paramTypes = methods[i].getParameterTypes();
                if (paramTypes.length == 1) {
                    visitMethods.put(paramTypes[0], methods[i]);
                }
            }
        }
    }

    {
        initVisitMethod();
    }
}

下面是两个具体的Visitor
public class PrintVisitor extends Visitor{

    public void visit(Float f){
        System.out.println("float:"+f);
    }
    public void visit(Date date){
        System.out.println("date:"+date);
    }
    public void visit(String str){
        System.out.println("string:"+str);
    }
}

public class PrintVisitor2 extends Visitor{

    public void visit(String str){
        System.out.println("string2:"+str);
    }
    public void visit(List list){
        System.out.println("list2:"+list);
    }
}

    public void testVisit(){
        ArrayList list = new ArrayList();
        list.add("a");
        list.add("b");
        Visitor v = new PrintVisitor();
        v.visit("hello");
        v.visit(new Date());
        Visitor v1 = new PrintVisitor2();
        v1.visit("hello");
        v1.visit(list);
    }
分享到:
评论
6 楼 shaucle 2006-12-27  
对于以前的visitor,如果需要新的功能(元素),那你的接口就要变,那么你所有的Visitor都得重写,如果第三方还用到了visitor,那就根本无法改变.也就是完全不兼容.

但现在,以前的Visitor可以不变,也就是说以前的功能还是存在(只是不能处理新的元素).
新加进来的元素可以用新的Visitor来处理,就像是一个完全兼容的升级版本.

而这也是一般实际情况 ^_^
5 楼 diaodou 2006-12-27  
当然也可以继承一个新的NewPrintVisitor
public class NewPrintVisitor extends PrintVisitor{  
 
    public void visit(D d){
    }
}  
但是原来的的visitor也可以这样子实现。
我觉得主要的问题是,如果我有1000个visitor,那么就多了1000个新的visitor,如果我又多了更多的元素呢?
4 楼 diaodou 2006-12-27  
假设有个类层次结构
A, B extends A, C extends A
你也实现了PrintVisitor,可以打印A,B,C
public class PrintVisitor extends Visitor{  
 
    public void visit(A a){  
    }
    public void visit(B b){
    }
    public void visit(C c){
    }
}  

问题是,我现在要增加一个类 D extends A
那么你的PrintVisitor还是要改变啊
3 楼 wangyonghe 2006-12-25  
反射的威力不小呀?
2 楼 shaucle 2006-12-25  
如果要设计组件之类的东东,应该经常用到visitor才对啊...
1 楼 shaucle 2006-12-22  
发现项目中老用visitor,不爽
不过现在很爽了,呵呵

刚写好,测试量不够,望各位多指点指点..

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    设计模式系列之visitor

    本篇文章将聚焦于"访问者(Visitor)"设计模式,这是一种行为设计模式,用于在不修改对象结构的情况下,为对象添加新的操作。接下来我们将深入探讨该模式的概念、实现及应用场景。 访问者模式的核心思想是将数据...

    C++ Visitor模式

    这样,我们可以在不修改`Shape`及其子类的基础上,添加新的`Visitor`来执行不同操作。 **四、优缺点** 优点: 1. 将数据结构与算法分离,易于扩展。 2. 访问者可以对对象结构进行统一操作,避免代码重复。 3. 支持...

    Laravel开发-visitor

    中间件可以检查是否已经记录了当前用户的访问,如果未记录,则将记录添加到数据库。 6. **视图** (resources/views/): 虽然 `visitor` 系统主要在后台工作,但你可能还需要创建一些视图来显示统计信息,例如最受...

    Visitor模式

    总的来说,访问者模式是一种在对象结构中添加新功能而不改变结构本身的设计模式,它适用于那些需要对多个对象进行相同操作,但这些操作又与对象结构本身分离的情况。正确使用访问者模式可以提高代码的可扩展性和可...

    访问者模式VisitorPattern

    访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问者模式将算法与数据结构分离,使得...

    visitor pattern

    在软件开发中,当需要为一个已经存在的类集合添加新的功能,而又不想破坏其封装性时,访客模式是一个非常实用的选择。 **基本思想** 访客模式的核心是定义了一个访问者接口,这个接口声明了对各种具体元素的访问...

    Visitor

    "Visitor" 在IT行业中可能指的是一个设计模式,即“访问者模式”。...总的来说,"Visitor"和"字体"结合在一起,可能是在开发一个能够遍历和操作字体相关元素的系统,例如字体管理工具、排版软件或者富文本编辑器。

    AXS Visitor Tracking System

    AXS Visitor Tracking System 提供源码,意味着用户可以自定义功能,适应特定需求,比如: 1. 自定义报告:根据业务需求定制报告模板,获取更针对性的数据分析。 2. 集成其他服务:将系统与其他工具(如CRM、ERP)...

    Laravel开发-visitor-log

    我们可以创建表格来显示日志条目,甚至可以添加过滤和排序功能,以便于分析访问模式。 为了便于管理和更新,可以使用Artisan命令行工具生成控制器、模型和视图文件。Artisan提供了一系列内置命令,如`make:model`、...

    设计模式之访问者模式(Visitor)

    访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...

    基于visitor模式和访问者模式的表达式树_求值引擎

    1. **Visitor模式**:这是一个行为设计模式,它允许在不改变元素类的情况下,为对象结构中的元素添加新的操作。在本项目中,Visitor模式被用来处理表达式树的节点。一个`Expression`接口或类定义了接受访问者的操作...

    试试visitor设计模式

    也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    这种机制使得可以在不改变元素类的情况下,为现有的类层次结构动态添加新的行为。 #### 动机与背景 在软件开发过程中,经常会遇到需求变更导致需要对现有系统进行修改的情况。特别是在处理复杂的类层次结构时,...

    C#设计模式之Visitor

    "Visitor"(访问者)设计模式是一种行为模式,它允许我们在不修改对象结构的前提下,为对象添加新的操作。 **二、Visitor模式的核心概念** 1. **元素对象(Element)**:这是被访问的对象,它们构成一个对象结构,...

    Visitor TT1 BRK

    Visitor TT1 BRK

    Reflect on the Visitor design pattern

    访问者模式(Visitor设计模式)是一种行为设计模式,它提供了一种在不修改对象结构的情况下对对象进行操作的方式。这个模式的主要目的是将算法与数据结构分离,使得算法可以在不改变对象结构的前提下增加新的操作。...

    21-Visitor.rar

    总结来说,访问者模式是一种强大的设计工具,它允许我们在不破坏原有类结构的基础上,向对象结构添加新的操作。通过"21-Visitor.rar"中的资源,我们可以深入学习这种模式,提升我们的设计能力,让软件系统更加灵活、...

Global site tag (gtag.js) - Google Analytics