Visitor

本文介绍了一个使用Java实现的员工薪资展示案例,通过Visitor模式来访问不同的员工类型(如职员和经理),并根据不同类型的员工打印其薪资信息。此案例展示了如何灵活地增加新的薪资打印方式。
package test0806;

import java.util.*;

abstract class employee {
    
private String name;

    
public String getName() {
        
return name;
    }


    
public void setName(String name) {
        
this.name = name;
    }


    
public employee(String name) {
        
this.name = name;
    }


    
public abstract int salary();

}


interface Visitable {
    
public void Accept(Visitor v);
}


class stuff extends employee implements Visitable {

    
public stuff(String name) {
        
super(name);
    }


    @Override
    
public int salary() {
        
return 3000;
    }


    
public void Accept(Visitor v) {
        v.visitStuff(
this);
    }


}


class manager extends employee implements Visitable {

    
public manager(String name) {
        
super(name);
        
// TODO Auto-generated constructor stub
    }


    @Override
    
public int salary() {
        
// TODO Auto-generated method stub
        return 5000;
    }


    
public void Accept(Visitor v) {
        v.visitManager(
this);
    }


}


interface Visitor {
    
void visitStuff(stuff s);

    
void visitManager(manager m);
}


class salaPrintA implements Visitor {

    
public void visitManager(manager m) {
        System.out.println(m.salary());
    }


    
public void visitStuff(stuff s) {
        System.out.println(s.salary());
    }


}


class salaPrintB implements Visitor {

    
public void visitManager(manager m) {
        System.out.println(m.getName() 
+ "'s salary is " + m.salary());
    }


    
public void visitStuff(stuff s) {
        System.out.println(s.getName() 
+ "'s salary is " + s.salary());
    }


}


class employees {
    
private ArrayList col = new ArrayList();

    
private Iterator i;

    
public void add(Visitable e) {
        col.add(e);
    }


    
public void Accept(Visitor v) {
        i 
= col.iterator();
        
while (i.hasNext()) {
            
//System.out.println((i));
            
//System.out.println(i.getClass()+"DDDD");
            ((Visitable) i.next()).Accept(v);
        }

    }

}


public class VisitorTest {

    
public static void main(String[] args) {
        employees es 
= new employees();
        stuff s1 
= new stuff("s1");
        stuff s2 
= new stuff("s2");
        manager m1 
= new manager("m1");
        es.add(s1);
        es.add(s2);
        es.add(m1);
        Visitor VA 
= new salaPrintA();
        Visitor VB 
= new salaPrintB();
        es.Accept(VA);
        es.Accept(VB);
    }


}

 
### 使用 JSQLParser 的 Visitor 模式进行 SQL 解析 JSQLParser 提供了一种强大的机制来遍历和操作 SQL 抽象语法树 (AST),即通过 `Visitor` 接口。此接口允许开发者创建自定义访问者类,用于处理特定类型的 SQL 节点。 为了实现 `Visitor` 模式的功能,在编写代码时通常会继承 `ExpressionVisitorAdapter` 或 `StatementVisitorAdapter` 类之一,这两个适配器实现了所有的方法但不做任何具体的操作,因此可以只重写感兴趣的方法[^1]。 下面是一个简单的例子展示如何利用 `Visitor` 来查找并打印所有表名: ```java import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.util.TablesNamesFinder; public class TablePrinter { public static void main(String[] args) throws JSQLParserException { Statement statement = CCJSqlParserUtil.parse("SELECT * FROM my_table WHERE id=1"); TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List<String> tableList = tablesNamesFinder.getTableList(statement); System.out.println(tableList); // 输出: [my_table] // 自定义 visitor 实现 MyCustomVisitor visitor = new MyCustomVisitor(); statement.accept(visitor); } } class MyCustomVisitor extends ExpressionVisitorAdapter implements StatementVisitor { @Override public void visit(net.sf.jsqlparser.schema.Table table){ System.out.println("Visited table name:" + table.getName()); } // 需要覆盖其他必要的visit方法... } ``` 在这个例子中,`MyCustomVisitor` 继承了两个适配器类,并覆写了其中一部分方法以便于当遇到表格节点(`Table`)的时候能够执行某些逻辑——这里只是简单地输出表的名字。对于更复杂的场景,则可能还需要进一步扩展这个类以满足需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值