Паттерны / Паттерны поведения
image

//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);


Представляет операцию, которую надо выполнить над элементами объекта. Позволяет определить новую операцию, не меняя классы элементов, к которым он применяется.