JS Strategy

by Ivan Gerasimenko

HTML

<a href="http://sokolmichael.com/posts/2013-03-08-strategy-design-pattern-in-javascript">Strategy pattern JS</a>

JavaScript

console.clear();
var log = function(msg) { console.log(msg); }

log("// STRATEGY AS A FUNCTION //");
// constructor
var Greeter = function(strategy) {
    this.strategy = strategy;
}

// prototype
Greeter.prototype.greet = function() {
    return this.strategy();
}

// functions
var politeGreetingStrategy = function() {
    console.log("Hello.");
}
var friendlyGreetingStrategy = function() {
    console.log("Hey!");
}
var boredGreetingStrategy = function() {
    console.log("sup.");
}

// using strategies
var politeGreeter = new Greeter(politeGreetingStrategy);
var friendlyGreeter = new Greeter(friendlyGreetingStrategy);
var boredGreeter = new Greeter(boredGreetingStrategy);

// testing...
politeGreeter.greet();
friendlyGreeter.greet();
boredGreeter.greet();

// how to show benifits of these tonns of code upthere?!?
// why not just do use :)
politeGreetingStrategy();


log("// STRATEGY AS A CLASS //");
var Strategy = function() {};

Strategy.prototype.execute = function() {
    throw new Error('Strategy.execute() needs to be overriden.')
}

var GreetingStrategy = function() {};
GreetingStrategy.prototype = Object.create(Strategy.prototype);

GreetingStrategy.prototype.execute = function() {
    return this.sayHi() + ' ' + this.sayBye();
}

GreetingStrategy.prototype.sayHi = function() {
    return 'Hello!';
}
GreetingStrategy.prototype.sayBye = function() {
    return 'Bye-bye!';
}

var Greeter1 = function(strategy) {
    this.strategy = strategy;
}
Greeter1.prototype.greet = function() {
    return this.strategy.execute();
}

var greeter = new Greeter1(new GreetingStrategy());
log(greeter.greet());

// how to show benifits of these tonns of code upthere?!?
// why not do simplier?!?