工厂模式很多人都了解,但是如果工厂里边的类非常多20个以上这样代码会非车繁琐。
下面我介绍一下访问者模式
我们设想一个场景,对PDF,PPT, WORD文档进行 压缩功能或者提取功能。
/** * 压缩 */ public class Compressor implements Visitor { @Override public void visit(PPTFile pptFile) { System.out.println("Compressor PPT."); } @Override public void visit(PdfFile pdfFile) { System.out.println("Compressor PDF."); } @Override public void visit(WordFile wordFile) { System.out.println("Compressor WORD."); } }
/** * 提取 */ public class Extractor implements Visitor { @Override public void visit(PPTFile pptFile) { System.out.println("Extract PPT."); } @Override public void visit(PdfFile pdfFile) { System.out.println("Extract PDF."); } @Override public void visit(WordFile wordFile) { System.out.println("Extract WORD."); } }
下边是三种文档
public class PdfFile extends ResourceFile { public PdfFile(String filePath) { super(filePath); } @Override public void accept(Visitor visitor) { visitor.visit(this); } }
public class WordFile extends ResourceFile { public WordFile(String filePath) { super(filePath); } @Override public void accept(Visitor visitor) { visitor.visit(this); } }
public class PPTFile extends ResourceFile { public PPTFile(String filePath) { super(filePath); } @Override public void accept(Visitor visitor) { visitor.visit(this); } }
/** * 访问者接口 */ public interface Visitor { void visit(PdfFile pdfFile); void visit(PPTFile pdfFile); void visit(WordFile pdfFile); }
下边是测试类:
public class test { 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; } }