首页 > 其他分享 >访问者模式

访问者模式

时间:2024-09-17 15:14:48浏览次数:8  
标签:Visitor 元素 模式 element 具体 public 访问者

访问者模式

“访问者模式”通常是指软件开发中的一种设计模式,也叫做“Visitor模式”。它属于行为型设计模式之一,主要用于将数据结构和操作解耦。通过使用访问者模式,可以在不修改数据结构的前提下,定义新的操作。

访问者模式的基本思想是:你有一个包含不同对象的对象结构(例如一个元素集合),而这些对象可能需要不同的操作。通过定义一个访问者(Visitor),你可以将这些操作封装在访问者中,并通过遍历对象结构来执行这些操作。这样做的好处是,如果需要对对象结构中的元素进行新的操作,或扩展现有操作,只需要修改或增加访问者,而不需要更改对象本身。

访问者模式的主要组成部分:

  1. Visitor(访问者):为不同类型的元素定义一个操作接口。通常,这个接口包含多个方法,每个方法对应一种元素类型。
  2. ConcreteVisitor(具体访问者):实现Visitor接口,为每种类型的元素实现相应的操作。
  3. Element(元素):定义一个接受访问者的接口。通常这个接口有一个accept方法,接受一个访问者对象。
  4. ConcreteElement(具体元素):实现Element接口,并在accept方法中调用访问者的相应方法。
  5. ObjectStructure(对象结构):保存元素集合并提供遍历这些元素的方法。

示例

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

    public String operationA() {
        return "具体元素A";
    }
}
// 具体元素B
class ConcreteElementB implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visitConcreteElementB(this);
    }

    public String operationB() {
        return "具体元素B";
    }
}// 访问者接口
interface Visitor {
    void visitConcreteElementA(ConcreteElementA element);
    void visitConcreteElementB(ConcreteElementB element);
}

// 具体访问者1
class ConcreteVisitor1 implements Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA element) {
        System.out.println(element.operationA() + " 被 具体访问者1 访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB element) {
        System.out.println(element.operationB() + " 被 具体访问者1 访问");
    }
}// 具体访问者2
class ConcreteVisitor2 implements Visitor {
    @Override
    public void visitConcreteElementA(ConcreteElementA element) {
        System.out.println(element.operationA() + " 被 具体访问者2 访问");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB element) {
        System.out.println(element.operationB() + " 被 具体访问者2 访问");
    }
}// 对象结构
class ObjectStructure {
    private List<Element> elements = new ArrayList<>();

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

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

public class TestVisitorPattern {
    public static void main(String[] args) {
        // 创建对象结构并添加元素
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.addElement(new ConcreteElementA());
        objectStructure.addElement(new ConcreteElementB());

        // 创建具体访问者
        Visitor visitor1 = new ConcreteVisitor1();
        Visitor visitor2 = new ConcreteVisitor2();

        // 使用访问者访问元素
        System.out.println("使用 具体访问者1 访问:");
        objectStructure.accept(visitor1);

        System.out.println("-----------------------------");

        System.out.println("使用 具体访问者2 访问:");
        objectStructure.accept(visitor2);
    }
}

代码解析:

  1. Element接口
    • 定义了一个accept方法,用于接收一个访问者对象。具体元素类将实现这个接口。
  2. 具体元素类(ConcreteElementA 和 ConcreteElementB)
    • 这些类实现了Element接口,在accept方法中,它们将自身作为参数传递给访问者的相应方法。
    • 每个具体元素类还有自己的操作方法,比如operationA()operationB()
  3. Visitor接口
    • 定义了访问具体元素的方法,例如visitConcreteElementAvisitConcreteElementB。每个方法都对应一种具体元素类型。
  4. 具体访问者类(ConcreteVisitor1 和 ConcreteVisitor2)
    • 这两个类实现了Visitor接口,并在visitConcreteElementAvisitConcreteElementB方法中定义了对具体元素的访问逻辑。
    • 不同的访问者类可以有不同的实现逻辑。例如,一个访问者可能会打印出某些信息,另一个访问者可能会执行其他操作。
  5. 对象结构(ObjectStructure)
    • 这个类包含一个元素集合,并提供了向集合中添加元素和接受访问者的方法。
    • accept方法用于遍历集合中的每个元素,并对其应用访问者。
  6. TestVisitorPattern类
    • 这个类是程序的入口点。在main方法中,创建了一个对象结构,并添加了两个具体元素(ConcreteElementAConcreteElementB)。
    • 然后,它创建了两个具体访问者(ConcreteVisitor1ConcreteVisitor2),并分别使用它们访问对象结构中的元素。

执行结果:

程序的执行将打印出访问者访问元素时的操作结果。例如:

css复制代码使用 具体访问者1 访问:
具体元素A 被 具体访问者1 访问
具体元素B 被 具体访问者1 访问
-----------------------------
使用 具体访问者2 访问:
具体元素A 被 具体访问者2 访问
具体元素B 被 具体访问者2 访问

总结

访问者模式的优点:

  • 符合单一职责原则:通过将操作分离到访问者中,元素类变得更加简洁。
  • 符合开闭原则:可以在不修改元素类的情况下增加新的操作。

访问者模式的缺点:

  • 违反依赖倒置原则:访问者模式要求具体元素依赖于具体访问者的接口,这与依赖倒置原则有所冲突。
  • 扩展性差:如果需要增加新的元素类型,可能需要对所有访问者进行修改。

访问者模式的适用场景:

  • 需要对一个对象结构中的对象执行多种操作。
  • 对象结构比较稳定,但操作经常变化的场景。

标签:Visitor,元素,模式,element,具体,public,访问者
From: https://www.cnblogs.com/20lxj666/p/18396290

相关文章

  • 模板方法模式
    模板方法模式模板方法模式(TemplateMethodPattern)是一种行为设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重写算法的某些步骤。通过这种模式,能够复用算法的整体流程,同时又能够灵活调整某些具体步骤的实现。模板方法模式的关键要素抽象类(AbstractClass......
  • 策略模式
    策略模式策略模式(StrategyPattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互换。这种模式允许算法在不影响客户端的情况下变化,从而提高了代码的灵活性和可维护性。策略模式的组成策略模式由以下几个部分组成:抽象策略(Strategy):这是一个接口或抽象......
  • 命令模式
    命令模式命令模式(CommandPattern)是行为型设计模式之一,它将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,以及对请求排队或记录请求日志等操作。通过使用命令模式,命令的发出者与命令的执行者可以完全解耦。命令模式的结构Command(命令接口/抽象类):定义了执行命令......
  • 责任链模式
    责任链模式责任链模式(ChainofResponsibilityPattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这个模式将请求的处理者连接成一条链,沿着这条链传递请求,直到某个处理者处理它为止。责任链模式的主要角色:抽象处理者(Handler):定......
  • 简单工厂模式
    简单工厂模式简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,通过一个工厂类来决定实例化哪一个类的对象。它是最常见的设计模式之一,主要用于将对象的创建与使用分离,减少代码重复,提高代码的可维护性。特点工厂角色:负责创建具体产品类的实例,通常是一个包含静态方法的......
  • 单列模式
    单列模式“单例模式(SingletonPattern),用于确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这个模式在需要控制资源的访问或者确保某些操作只有一个实例时使用。单例模式的特点唯一性:保证一个类只有一个实例。全局访问:提供一个全局的访问点来获取这个实例。延迟......
  • 23种设计模式
    23种设计模式设计模式是软件工程中用于解决特定问题的通用解决方案。常见的设计模式有24种,通常分为三大类:创建型、结构型和行为型。下面是对这24种设计模式的详细解释及其归类:1.创建型模式1.1单例模式(Singleton)目的:确保一个类只有一个实例,并提供一个全局访问点。适用场......
  • 适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。概念目标接口(Target):客户端期望使用的接口。源接口(Adaptee):需要被......
  • 原型模式
    原型模式原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。原型模式通常涉及以下几个角色:原型(Prototyp......
  • 建造者模式
    建造者模式建造者模式(BuilderPattern)是一种创建型设计模式,它用于分步骤地创建复杂对象,而无需直接调用构造函数。通过将对象的构建过程与其表示(即对象内部细节的实现)分离,建造者模式允许创建不同的对象表示,同时保持构造过程的一致性。特点分步骤创建:建造者模式将对象的创建过程......