Java高级设计模式:从理论到复杂示例
设计模式是软件开发中经过验证的典型问题解决方案。如果基本模式(Singleton、Factory、Observer)对大多数Java开发人员来说都很熟悉,那么高级模式则需要深入理解架构,并能够在复杂的业务场景中应用它们。在本文中,我们将分析三种强大的模式:Visitor、Command和State,并提供真实的Java示例,帮助您编写更灵活、更易于维护的代码。
1. Visitor模式:将算法与数据结构分离
目的:允许为不同类的对象添加新操作,而无需修改这些类本身。非常适合处理复杂的层次结构,其中需要根据对象类型执行不同的操作。
问题:想象一个文档管理系统,其中有TextDocument、ImageDocument和SpreadsheetDocument类。您需要实现导出为PDF、HTML和TXT格式。如果没有Visitor模式,每种新的导出格式都需要修改所有文档类。
使用Visitor的解决方案:
// 1. 元素接口(文档)interface DocumentElement { void accept(DocumentVisitor visitor);}
// 2. 具体元素class TextDocument implements DocumentElement { private String content; public TextDocument(String content) { this.content = content; } public String getContent() { return content; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}
class ImageDocument implements DocumentElement { private byte[] imageData; public ImageDocument(byte[] data) { this.imageData = data; } public byte[] getImageData() { return imageData; } @Override public void accept(DocumentVisitor visitor) { visitor.visit(this); }}
// 3. Visitor接口interface DocumentVisitor { void visit(TextDocument doc); void visit(ImageDocument doc); void visit(SpreadsheetDocument doc);}
// 4. 具体Visitor — 导出为HTMLclass HtmlExporter implements DocumentVisitor { private StringBuilder sb = new StringBuilder(); @Override public void visit(TextDocument doc) { sb.append("<html><body><p>") .append(doc.getContent()) .append("</p></body></html>"); } @Override public void visit(ImageDocument doc) { sb.append("<html><body><img src='data:image/png;base64,") .append(Base64.getEncoder().encodeToString(doc.getImageData())) .append("'/></body></html>"); } @Override public void visit(SpreadsheetDocument doc) { sb.append("<html><body><table>...</table></body></html>"); } public String getResult() { return sb.toString(); }}
// 5. 客户端代码public class DocumentSystem { public static void main(String[] args) { List<DocumentElement> documents = Arrays.asList( new TextDocument("Hello World"), new ImageDocument(new byte[]{1,2,3}) ); HtmlExporter exporter = new HtmlExporter(); for (DocumentElement doc : documents) { doc.accept(exporter); } System.out.println(exporter.getResult()); }}关键优势:要添加新格式(例如JSON),只需创建一个新类JsonExporter implements DocumentVisitor — 所有文档类都无需更改。