访问者模式
字数: 0 字 时长: 0 分钟
简介
访问者模式(Visitor Pattern)的核心思想是:让新的操作可以在不改变数据结构的前提下添加进来。
UML 类图
- 抽象元素(Element):所有元素的基类或接口,声明了接受访问者的
accept()
方法 - 具体元素(ConcreteElement):实现抽象元素定义的接口
- 抽象访问者(Visitor):定义了针对每个具体元素类的操作
- 具体访问者(ConcreteVisitor):实现抽象访问者定义的接口
- 对象结构(ObjectStructure):管理元素对象,允许访问者访问结构中的每个元素
实现示例
以“文档格式转换”为例:
java
// 1. 定义访问者接口
interface DocumentVisitor {
void visit(PDFDocument pdf);
void visit(WordDocument word);
void visit(ExcelDocument excel);
}
// 2. 定义抽象元素类
interface Document {
void accept(DocumentVisitor visitor);
}
// 3. 实现具体元素类
class PDFDocument implements Document {
private String content;
public PDFDocument(String content) {
this.content = content;
}
public String getContent() {
return content;
}
@Override
public void accept(DocumentVisitor visitor) {
visitor.visit(this);
}
}
class WordDocument implements Document {
private String content;
public WordDocument(String content) {
this.content = content;
}
public String getContent() {
return content;
}
@Override
public void accept(DocumentVisitor visitor) {
visitor.visit(this);
}
}
class ExcelDocument implements Document {
private String[] tables;
public ExcelDocument(String[] tables) {
this.tables = tables;
}
public String[] getTables() {
return tables;
}
@Override
public void accept(DocumentVisitor visitor) {
visitor.visit(this);
}
}
// 4. 创建具体访问者类
class HtmlVisitor implements DocumentVisitor {
@Override
public void visit(PDFDocument pdf) {
System.out.println("<html><body><h1>" + pdf.getContent() + "</h1></body></html>");
}
@Override
public void visit(WordDocument word) {
System.out.println("<html><body><h1>" + word.getContent() + "</h1></body></html>");
}
@Override
public void visit(ExcelDocument excel) {
System.out.println("表格渲染 excel 数据");
}
}