Skip to content

访问者模式

字数: 0 字 时长: 0 分钟

简介

访问者模式(Visitor Pattern)的核心思想是:让新的操作可以在不改变数据结构的前提下添加进来

UML 类图

visitor.webp

  • 抽象元素(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 数据");
    }
}