
//ConcreteElement
class Engine {
accept(v) {
v.visitEngine(this);
}
}
//ConcreteElement
class Wheel {
constructor(wNumber) {
this.number = wNumber;
}
getNumber() {
return this.number;
}
accept(v) {
v.visitWheel(this);
}
}
//ConcreteElement
class Car {
constructor() {
this.items = [
new Engine(),
new Wheel(1), new Wheel(2),
new Wheel(3), new Wheel(4)];
}
accept(v) {
for (let i in this.items) {
if (this.items.hasOwnProperty(i)) {
this.items[i].accept(v);
}
}
v.visitCar(this);
}
}
//ConcreteVisitor
class TestCarVisitor {
visitEngine(engine) {
console.log("test engine");
}
visitWheel(wheel) {
console.log("test wheel #" +
wheel.getNumber());
}
visitCar(car) {
console.log("test car");
}
}
//ConcreteVisitor
class RepairCarVisitor {
visitEngine(engine) {
console.log("repair engine");
}
visitWheel(wheel) {
console.log("repair wheel #" +
wheel.getNumber());
}
visitCar(car) {
console.log("repair car");
}
}
//Client
let car = new Car();
let v1 = new TestCarVisitor();
let v2 = new RepairCarVisitor();
car.accept(v1);
car.accept(v2);
| Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. |