当前位置:首页 > JavaScript

访问者模式js实现

2026-03-01 23:58:46JavaScript

访问者模式概述

访问者模式是一种行为设计模式,允许在不修改对象结构的情况下定义新操作。核心思想是将算法与对象结构分离,通过“访问者”对象集中处理不同对象的操作。

实现步骤

定义元素接口
元素接口声明一个accept方法,用于接受访问者对象:

class Element {
  accept(visitor) {
    throw new Error("Method 'accept()' must be implemented.");
  }
}

实现具体元素类
每个具体元素类实现accept方法,调用访问者中对应自身类型的方法:

class ConcreteElementA extends Element {
  accept(visitor) {
    visitor.visitConcreteElementA(this);
  }

  operationA() {
    return "Element A operation";
  }
}

class ConcreteElementB extends Element {
  accept(visitor) {
    visitor.visitConcreteElementB(this);
  }

  operationB() {
    return "Element B operation";
  }
}

定义访问者接口
访问者接口声明一组visit方法,每个方法对应一种元素类型:

class Visitor {
  visitConcreteElementA(element) {
    throw new Error("Method 'visitConcreteElementA()' must be implemented.");
  }

  visitConcreteElementB(element) {
    throw new Error("Method 'visitConcreteElementB()' must be implemented.");
  }
}

实现具体访问者
具体访问者实现接口中定义的所有方法,定义对各类元素的操作逻辑:

class ConcreteVisitor1 extends Visitor {
  visitConcreteElementA(element) {
    console.log(`Visitor1: ${element.operationA()}`);
  }

  visitConcreteElementB(element) {
    console.log(`Visitor1: ${element.operationB()}`);
  }
}

class ConcreteVisitor2 extends Visitor {
  visitConcreteElementA(element) {
    console.log(`Visitor2: ${element.operationA()}`);
  }

  visitConcreteElementB(element) {
    console.log(`Visitor2: ${element.operationB()}`);
  }
}

客户端调用示例
客户端创建元素集合和访问者,通过accept方法触发访问逻辑:

const elements = [new ConcreteElementA(), new ConcreteElementB()];
const visitor1 = new ConcreteVisitor1();
const visitor2 = new ConcreteVisitor2();

elements.forEach(element => {
  element.accept(visitor1);
  element.accept(visitor2);
});

关键点

  • 双分派机制:通过两次动态分配(元素调用accept,访问者调用visit)实现多态行为。
  • 扩展性:新增操作只需添加访问者类,无需修改元素类。
  • 适用场景:对象结构稳定但需频繁新增操作的场景(如编译器语法树处理)。

输出示例

执行上述客户端代码后,控制台输出:

Visitor1: Element A operation  
Visitor2: Element A operation  
Visitor1: Element B operation  
Visitor2: Element B operation  

访问者模式js实现

标签: 访问者模式
分享给朋友:

相关文章

如何启用react并发模式

如何启用react并发模式

启用 React 并发模式的方法 React 并发模式(Concurrent Mode)是 React 18 引入的一项功能,允许应用在渲染过程中保持响应性。以下是启用并发模式的步骤: 安装 Rea…

react的并发模式该如何使用

react的并发模式该如何使用

React 并发模式简介 React 的并发模式(Concurrent Mode)是一组新特性,旨在提升应用的响应速度和用户体验。它通过可中断渲染、优先级调度和时间切片(Time Slicing)等机…

php怎么实现单例模式

php怎么实现单例模式

单例模式的基本概念 单例模式确保一个类只有一个实例,并提供一个全局访问点。适用于需要频繁创建和销毁的对象,或控制资源访问的场景(如数据库连接、日志管理等)。 PHP 单例模式的实现步骤 私有化…

php调试模式实现

php调试模式实现

PHP调试模式实现方法 开启PHP调试模式可以帮助开发者在开发过程中快速定位和解决问题。以下是几种常见的实现方法: 使用ini_set函数动态开启 在PHP脚本中动态开启错误报告和显示错误:…

js实现单例模式

js实现单例模式

单例模式的基本概念 单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。在JavaScript中,可以通过多种方式实现单例模式。 使用对象字面量 最简单的单例实现方式是直接使用对象字面…

js 实现单例模式

js 实现单例模式

使用闭包实现单例模式 闭包可以封装私有变量,确保实例唯一性。通过立即执行函数返回一个获取实例的方法,首次调用时创建实例,后续调用直接返回已创建的实例。 const Singleton = (fun…