魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • DesignPattern - 访问者模式

文章摘要: 访问者模式使用总结。

简介

简要说明

  • 访问者模式(Visitor Pattern)是一种行为型设计模式。
  • 定义了一个操作对象结构的接口,让访问者能够对对象结构中的元素进行操作,而不改变这些元素所属的类。

主要功能

  • 表示一个作用于某对象结构中的各元素的操作,它可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  • 将操作与对象结构分离,使得操作可以独立变化。
  • 可以在不修改现有类层次结构的情况下,增加新的操作。

注意事项

  • 访问者模式会增加系统复杂度,因为它要求元素类能够接受访问者对象,这就要求元素类必须有一个接收访问者的接口。
  • 访问者模式要求对象结构中的元素类是稳定的,如果元素类经常变化,那么引入访问者模式可能不合适。
  • 访问者对象访问元素类的具体实现时,可能需要了解元素类的内部细节,这可能会破坏封装性。

适用场景

  • 对象结构相对稳定,但经常需要在此对象结构上定义新的操作。
  • 需要对对象结构中的对象进行很多不同的并且不相关的操作,而需要避免这些操作污染这些对象的类,也不希望在类中添加新的特性。

Java 8

案例

// 定义一个表示元素的接口
interface Element {
    void accept(Visitor visitor);
}

// 具体的元素类A
class ConcreteElementA implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String operationA() {
        return "ConcreteElementA";
    }
}

// 具体的元素类B
class ConcreteElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public String operationB() {
        return "ConcreteElementB";
    }
}

// 访问者接口
interface Visitor {
    void visit(ConcreteElementA elementA);
    void visit(ConcreteElementB elementB);
}

// 具体的访问者类
class ConcreteVisitor implements Visitor {
    @Override
    public void visit(ConcreteElementA elementA) {
        System.out.println("Visited " + elementA.operationA());
    }

    @Override
    public void visit(ConcreteElementB elementB) {
        System.out.println("Visited " + elementB.operationB());
    }
}

// 对象结构类,通常包含一个元素集合
class ObjectStructure {
    private List<Element> elements = new ArrayList<>();

    public void attach(Element element) {
        elements.add(element);
    }

    public void detach(Element element) {
        elements.remove(element);
    }

    public void accept(Visitor visitor) {
        for (Element element : elements) {
            element.accept(visitor);
        }
    }
}

// 客户端代码
public class VisitorPatternDemo {
    public static void main(String[] args) {
        // 创建对象结构
        ObjectStructure structure = new ObjectStructure();

        // 添加元素到对象结构
        structure.attach(new ConcreteElementA());
        structure.attach(new ConcreteElementB());

        // 创建访问者
        Visitor visitor = new ConcreteVisitor();

        // 对象结构接受访问者
        structure.accept(visitor);
    }
}

注释

  • 在这个例子中,Element接口定义了一个accept方法,该方法接受一个Visitor对象作为参数。
  • ConcreteElementA和ConcreteElementB是具体的元素类,它们实现了Element接口,并在accept方法中调用访问者的visit方法。
  • Visitor接口定义了访问者可以执行的操作,这里有两个visit方法,分别对应不同的元素类。
  • ConcreteVisitor是具体的访问者类,它实现了Visitor接口,并在visit方法中定义了访问元素时执行的操作。
  • ObjectStructure类表示对象结构,它包含一个元素集合,并提供方法来添加、移除元素以及接受访问者。
  • 在客户端代码VisitorPatternDemo中,我们创建了一个对象结构,添加了两个元素,并创建了一个访问者。然后,我们调用对象结构的accept方法,这会遍历所有元素并调用它们的accept方法,从而触发访问者的visit方法。这样,访问者就可以对每个元素执行特定的操作,而无需修改元素类本身。
更新时间: 2025/10/3 17:56