Dotcpp  >  编程教程  >  行为型模式(Behavioral Patterns)  >  访问者模式

访问者模式

点击打开在线编译器,边学边练

访问者模式的目的是将数据结构和对数据的操作分离开来,使得操作可以独立变化而不影响数据结构。

在访问者模式中,有两个核心概念:元素(Element)和访问者(Visitor)。元素表示数据结构中的每个具体元素,而访问者则表示对元素的具体操作。

访问者模式的核心思想是,元素对象接受一个访问者对象,并将自身传递给访问者对象,从而允许访问者根据元素的不同类型执行不同的操作。这样,元素对象和访问者对象可以独立演化,互不影响。

访问者模式

下面是一个简单的示例来演示访问者模式的使用:

// 定义元素接口
public interface Element {
    void accept(Visitor visitor); // 接受访问者对象
}
// 具体元素类A
public class ConcreteElementA implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this); // 将自身传递给访问者对象
    }
    public void operationA() {
        System.out.println("具体元素A的操作方法");
    }
}
// 具体元素类B
public class ConcreteElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this); // 将自身传递给访问者对象
    }
    public void operationB() {
        System.out.println("具体元素B的操作方法");
    }
}
// 定义访问者接口
public interface Visitor {
    void visit(ConcreteElementA element); // 对具体元素A的操作
    void visit(ConcreteElementB element); // 对具体元素B的操作
}
// 具体访问者类
public class ConcreteVisitor implements Visitor {
    @Override
    public void visit(ConcreteElementA element) {
        element.operationA(); // 对具体元素A的操作
    }
    @Override
    public void visit(ConcreteElementB element) {
        element.operationB(); // 对具体元素B的操作
    }
}
// 客户端代码
public class Client {
    public static void main(String[] args) {
        Element elementA = new ConcreteElementA();
        Element elementB = new ConcreteElementB();
        Visitor visitor = new ConcreteVisitor();
        elementA.accept(visitor); // 元素A接受访问者
        elementB.accept(visitor); // 元素B接受访问者
    }
}

在这个示例中,Element接口定义了一个accept方法,该方法接受一个Visitor对象;ConcreteElementA和ConcreteElementB是Element接口的具体实现类,它们分别实现了自身特定的操作方法,并在accept方法中将自身传递给Visitor对象;Visitor接口定义了visit方法,用于对各个具体元素进行访问和操作;ConcreteVisitor是Visitor接口的具体实现类,它实现了对具体元素的访问和操作。

通过使用访问者模式,我们可以在不改变元素对象的情况下,定义新的操作,更好地实现了开放-封闭原则。而且,访问者模式还可以避免在元素对象中引入大量的业务逻辑,使得元素对象保持简洁。


本文固定URL:https://www.dotcpp.com/course/1388

上一课:

模板模式

Dotcpp在线编译      (登录可减少运行等待时间)