一、概念
访问者模式(Visitor Pattern):我们使用了一个访问者类,改变元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。
优点:把业务操作跟具体的数据结构解耦。
二、实现
我们实现对不同文件的不同操作。
1、文件基类
public abstract class File {
protected String filePath;
public File(String filePath){
this.filePath = filePath;
}
abstract public void setVisitor(Visitor visitor);
}
2、文件类
public class TxtFile extends File {
public TxtFile(String filePath) {
super(filePath);
}
@Override
public void setVisitor(Visitor visitor) {
visitor.visit(this);
}
}
public class WordFile extends File {
public WordFile(String filePath) {
super(filePath);
}
@Override
public void setVisitor(Visitor visitor) {
visitor.visit(this);
}
}
3、操作类
public interface Visitor {
void visit(WordFile wordFile);
void visit(TxtFile txtFile);
}
public class Compressor implements Visitor {
@Override
public void visit(TxtFile txtFile) {
System.out.println("压缩txt");
}
@Override
public void visit(WordFile wordFile) {
System.out.println("压缩word");
}
}
public class Copy implements Visitor {
@Override
public void visit(TxtFile txtFile) {
System.out.println("复制txt");
}
@Override
public void visit(WordFile wordFile) {
System.out.println("复制word");
}
}
3、测试类
public class Client {
public static void main(String[] args) {
TxtFile txtFile = new TxtFile("/root/aaa.txt");
WordFile wordFile = new WordFile("/root/bbb.doc");
Compressor compressor = new Compressor();
txtFile.setVisitor(compressor);
wordFile.setVisitor(compressor);
Copy copy = new Copy();
txtFile.setVisitor(copy);
wordFile.setVisitor(copy);
}
}
4、运行结果
总结:通过上面的例子,在梳理下概念,我们使用了一个访问者类,改变元素类的执行算法。这个访问类就是例子中的Visitor
业务操作类。改变元素类的执行算法,来控制对数据结构的操作方式,也就是执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。