设计模式——访问者模式(Visitor)

访问者模式(Visitor Pattern)是一种将数据操作与数据结构分离的设计模式。这种模式适用于数据结构相对稳定,而操作算法经常改变的情况。访问者模式将数据结构(稳定的部分)中的元素(Element)的访问行为(变化的部分)封装在一个独立的访问者(Visitor)类中,使得可以在不修改数据结构的前提下增加新的操作。

访问者模式包含以下几个角色:

  1. Visitor(访问者):接口声明了一个或多个访问操作,每个操作对应数据结构中的一种可能元素类型。

  2. ConcreteVisitor(具体访问者):实现Visitor接口,为每个Element类提供一个访问操作实现,该操作会执行相应的业务逻辑。

  3. Element(元素):接口或抽象类,定义了一个接受访问者(accept)的方法,该方法通常以访问者作为参数。

  4. ConcreteElement(具体元素):实现了Element接口或继承了Element抽象类,实现了accept()方法,该方法通常调用访问者的访问操作并传入自己作为参数。

  5. ObjectStructure(对象结构):是元素的集合,它可以是组合模式的结构、数组或其他数据结构。它提供一种让访问者可以访问其所有元素的能力,如可以遍历所有元素并调用元素的accept()方法。

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

java 复制代码
// 访问者接口
public interface Visitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}

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

    @Override
    public void visit(ConcreteElementB element) {
        System.out.println("Visiting ConcreteElementB: " + element.operationB());
    }
}

// 元素接口
public interface Element {
    void accept(Visitor visitor);
}

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

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

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

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

// 对象结构示例(这里使用简单的集合)
import java.util.ArrayList;
import java.util.List;

public 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 Client {
    public static void main(String[] args) {
        ObjectStructure os = new ObjectStructure();
        os.attach(new ConcreteElementA());
        os.attach(new ConcreteElementB());

        Visitor visitor = new ConcreteVisitor();

        os.accept(visitor);
    }
}

在上面的示例中,ConcreteVisitor实现了Visitor接口,并为每种类型的Element提供了访问方法。ConcreteElementAConcreteElementB实现了Element接口,并实现了accept方法以接受访问者。ObjectStructure作为元素的集合,它允许访问者访问其所有元素。客户端代码创建了ObjectStructure实例,并添加了一些Element实例,然后创建了一个Visitor实例,并让ObjectStructure接受这个Visitor。这样,Visitor就能够访问所有的Element实例,并执行相应的操作。

相关推荐
晨米酱2 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机7 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机8 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机8 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤8 小时前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤1 天前
工厂模式
设计模式