访问者模式

title

访问者模式(Visitor Pattern)是一种行为型设计模式,它在不改变已有类的情况下,定义了一组新的操作方法,以应对已有类中的各种元素。访问者模式将算法与对象结构分离开来,使得算法可以独立于对象结构而变化。

在访问者模式中,有两类对象:访问者和被访问者。被访问者是指具体的对象,它们可能是复杂的对象结构,如树形结构或图形结构等。访问者是指一组新的操作方法,它们将应用于被访问者中的各个元素。访问者的方法需要访问被访问者中的各个元素,从而完成特定的操作。

在访问者模式中,访问者通过调用被访问者中的 accept() 方法来访问被访问者中的元素,从而完成操作。被访问者中的 accept() 方法接受一个访问者作为参数,并将自己作为参数传递给访问者的操作方法。访问者中的操作方法可以根据不同的被访问者类型,执行不同的操作。

以下是使用访问者模式的一个简单示例代码:

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

// 具体访问者A
class ConcreteVisitorA implements Visitor {
    @Override
    public void visit(ConcreteElementA element) {
        System.out.println("ConcreteVisitorA visit ConcreteElementA");
    }

    @Override
    public void visit(ConcreteElementB element) {
        System.out.println("ConcreteVisitorA visit ConcreteElementB");
    }
}

// 具体访问者B
class ConcreteVisitorB implements Visitor {
    @Override
    public void visit(ConcreteElementA element) {
        System.out.println("ConcreteVisitorB visit ConcreteElementA");
    }

    @Override
    public void visit(ConcreteElementB element) {
        System.out.println("ConcreteVisitorB visit ConcreteElementB");
    }
}

// 抽象被访问者
interface Element {
    void accept(Visitor visitor);
}

// 具体被访问者A
class ConcreteElementA implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

// 具体被访问者B
class ConcreteElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

// 对象结构
class ObjectStructure {
    private List<Element> elements = new ArrayList<>();

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

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

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

// 测试类
public class Main {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new ConcreteElementA());
        objectStructure.add(new ConcreteElementB());

        Visitor visitorA = new ConcreteVisitorA();
        Visitor visitorB = new ConcreteVisitorB();

        objectStructure.accept(visitorA);
        objectStructure.accept(visitorB);
    }
}

在上面的代码中,访问者接口定义了 visit() 方法,该方法分别接受不同类型的被访问者作为参数。具体访问者A和具体访问者B分别实现了 Visitor 接口的方法,分别针对不同的被访问者类型,执行不同的操作。

抽象被访问者接口定义了 accept() 方法,该方法接受一个访问者作为参数。具体被访问者A和具体被访问者B分别实现了 accept() 方法,将自己作为参数传递给访问者的操作方法。

对象结构类中包含了被访问者的集合,它实现了 accept() 方法,遍历集合中的每个被访问者,调用它们的 accept() 方法,将访问者作为参数传递给被访问者。

powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:01

results matching ""

    No results matching ""