这个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);
}
分享到:
相关推荐
访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...
本篇文章将聚焦于"访问者(Visitor)"设计模式,这是一种行为设计模式,用于在不修改对象结构的情况下,为对象添加新的操作。接下来我们将深入探讨该模式的概念、实现及应用场景。 访问者模式的核心思想是将数据...
这样,我们可以在不修改`Shape`及其子类的基础上,添加新的`Visitor`来执行不同操作。 **四、优缺点** 优点: 1. 将数据结构与算法分离,易于扩展。 2. 访问者可以对对象结构进行统一操作,避免代码重复。 3. 支持...
中间件可以检查是否已经记录了当前用户的访问,如果未记录,则将记录添加到数据库。 6. **视图** (resources/views/): 虽然 `visitor` 系统主要在后台工作,但你可能还需要创建一些视图来显示统计信息,例如最受...
总的来说,访问者模式是一种在对象结构中添加新功能而不改变结构本身的设计模式,它适用于那些需要对多个对象进行相同操作,但这些操作又与对象结构本身分离的情况。正确使用访问者模式可以提高代码的可扩展性和可...
访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问者模式将算法与数据结构分离,使得...
在软件开发中,当需要为一个已经存在的类集合添加新的功能,而又不想破坏其封装性时,访客模式是一个非常实用的选择。 **基本思想** 访客模式的核心是定义了一个访问者接口,这个接口声明了对各种具体元素的访问...
"Visitor" 在IT行业中可能指的是一个设计模式,即“访问者模式”。...总的来说,"Visitor"和"字体"结合在一起,可能是在开发一个能够遍历和操作字体相关元素的系统,例如字体管理工具、排版软件或者富文本编辑器。
AXS Visitor Tracking System 提供源码,意味着用户可以自定义功能,适应特定需求,比如: 1. 自定义报告:根据业务需求定制报告模板,获取更针对性的数据分析。 2. 集成其他服务:将系统与其他工具(如CRM、ERP)...
我们可以创建表格来显示日志条目,甚至可以添加过滤和排序功能,以便于分析访问模式。 为了便于管理和更新,可以使用Artisan命令行工具生成控制器、模型和视图文件。Artisan提供了一系列内置命令,如`make:model`、...
访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...
1. **Visitor模式**:这是一个行为设计模式,它允许在不改变元素类的情况下,为对象结构中的元素添加新的操作。在本项目中,Visitor模式被用来处理表达式树的节点。一个`Expression`接口或类定义了接受访问者的操作...
也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。
这种机制使得可以在不改变元素类的情况下,为现有的类层次结构动态添加新的行为。 #### 动机与背景 在软件开发过程中,经常会遇到需求变更导致需要对现有系统进行修改的情况。特别是在处理复杂的类层次结构时,...
"Visitor"(访问者)设计模式是一种行为模式,它允许我们在不修改对象结构的前提下,为对象添加新的操作。 **二、Visitor模式的核心概念** 1. **元素对象(Element)**:这是被访问的对象,它们构成一个对象结构,...
Visitor TT1 BRK
访问者模式(Visitor设计模式)是一种行为设计模式,它提供了一种在不修改对象结构的情况下对对象进行操作的方式。这个模式的主要目的是将算法与数据结构分离,使得算法可以在不改变对象结构的前提下增加新的操作。...
总结来说,访问者模式是一种强大的设计工具,它允许我们在不破坏原有类结构的基础上,向对象结构添加新的操作。通过"21-Visitor.rar"中的资源,我们可以深入学习这种模式,提升我们的设计能力,让软件系统更加灵活、...