定义:允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。
public abstract class ResourceFile {protected String filePath;public ResourceFile(String filePath) {this.filePath = filePath;}abstract public void accept(Visitor vistor);}public class PdfFile extends ResourceFile {public PdfFile(String filePath) {super(filePath);}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}//...}//...PPTFile、WordFile跟PdfFile类似,这里就省略了...public interface Visitor {void visit(PdfFile pdfFile);void visit(PPTFile pdfFile);void visit(WordFile pdfFile);}public class Extractor implements Visitor {@Overridepublic void visit(PPTFile pptFile) {//...System.out.println("Extract PPT.");}@Overridepublic void visit(PdfFile pdfFile) {//...System.out.println("Extract PDF.");}@Overridepublic void visit(WordFile wordFile) {//...System.out.println("Extract WORD.");}}public class Compressor implements Visitor {@Overridepublic void visit(PPTFile pptFile) {//...System.out.println("Compress PPT.");}@Overridepublic void visit(PdfFile pdfFile) {//...System.out.println("Compress PDF.");}@Overridepublic void visit(WordFile wordFile) {//...System.out.println("Compress WORD.");}}public class ToolApplication {public static void main(String[] args) {Extractor extractor = new Extractor();List<ResourceFile> resourceFiles = listAllResourceFiles(args[0]);for (ResourceFile resourceFile : resourceFiles) {resourceFile.accept(extractor);}Compressor compressor = new Compressor();for(ResourceFile resourceFile : resourceFiles) {resourceFile.accept(compressor);}}private static List<ResourceFile> listAllResourceFiles(String resourceDirectory) {List<ResourceFile> resourceFiles = new ArrayList<>();//...根据后缀(pdf/ppt/word)由工厂方法创建不同的类对象(PdfFile/PPTFile/WordFile)resourceFiles.add(new PdfFile("a.pdf"));resourceFiles.add(new WordFile("b.word"));resourceFiles.add(new PPTFile("c.ppt"));return resourceFiles;}}
