JavaScript Visitor Design Pattern

The Visitor pattern defines a new operation or a set of operations on an object or a set of objects without changing the objects themselves. The new logic is implemented in a separate object defined as visitor. That is useful when building extensibility in a library or a framework. If objects provide a visit method accepting the visitor object making alterations to the current one, then there is a flawless way for clients to implement future extensions.

The Visitor pattern is less important in JavaScript as it offers the ability to add and remove methods at runtime but it is still useful to have that pattern in mind.

    var vessel = function (name, speed, size) {
        var self = this;

        self.name = name;
        self.speed = speed;
        self.size = size;
        
        self.accept = function (visitor) {
            visitor.visit(self);
        };
 
        self.getName = function () {
            return self.name;
        };
 
        self.getSpeed = function () {
            return self.speed;
        };
 
        self.setSpeed = function (speed) {
            self.speed = speed;
        };
 
        self.getSize = function () {
            return self.size;
        };
 
        self.setSize = function (size) {
            self.size = size;
        };
    };
 
    var vesselSpeedUp = function () {
        this.visit = function (vessel) {
            vessel.setSpeed(vessel.getSpeed() * 2.5); //2.5 times faster
        };
    };

    var vesselEnlarge = function () {
        this.visit = function (vessel) {
            vessel.setSize(vessel.getSize() * 2); //twice bigger
        };
    };

Applying the pattern now is easy:

    var target = new vessel("tanker", 25, 350);
    var speedUp = new vesselSpeedUp();
    var enlarge = new vesselEnlarge();

    target.accept(speedUp);
    target.accept(enlarge);

    console.log(target.getSpeed());
    console.log(target.getSize());