被访问者接口:
public interface ITarget {
public void doSomeThing();
public void accept(IVisitor visitor);
}
访问者接口:
public interface IVisitor {
public void visit(ITarget target);
}
被访问者:
public class TargetOne implements ITarget {
@Override
public void doSomeThing() {
System.out.println("TargetOne do some thing.");
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
public class TargetTwo implements ITarget {
@Override
public void doSomeThing() {
System.out.println("TargetTwo do some thing.");
}
@Override
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
访问者:
public class Visitor implements IVisitor {
@Override
public void visit(ITarget target) {
target.doSomeThing();
// 获得了ITarget的引用,可以在这里扩展ITarget接口类型的功能
System.out.println("Visitor.visit");
System.out.println("获得了ITarget的引用,可以在这里扩展ITarget接口类型的共用功能,而不必修改每一个ITarget接口实现类");
System.out.println("此处也可以用来获得 ITarget 下属的某个非公开资源,而只在当前的访问者方法中使用该非公开资源,从而保证资源的安全");
}
}
使用者:
public class Consumer {
public static void main(String[] args) {
ITarget targetOne = new TargetOne();
ITarget targetTwo = new TargetTwo();
IVisitor visitor = new Visitor();
// visitor.visit(targetOne);
// visitor.visit(targetTwo);
targetOne.accept(visitor);
targetTwo.accept(visitor);
//两种使用方式,代表不同思路,从访问者出发以及从被访问者出发
}
}