Skip to content

Instantly share code, notes, and snippets.

@b-ma
Last active December 28, 2015 15:49
Show Gist options
  • Save b-ma/7524863 to your computer and use it in GitHub Desktop.
Save b-ma/7524863 to your computer and use it in GitHub Desktop.
Strategy pattern
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Pattern Strategy</title>
</head>
<body>
<script src="./strategy.js"></script>
<script>
var simpleDuck = new Duck('simpleDuck');
var rubberDuck = new Duck('rubberDuck');
var strangeDuck = new Duck('strangeDuck');
simpleDuck.getName();
simpleDuck.fly();
simpleDuck.makeSound();
rubberDuck.getName();
rubberDuck.fly();
rubberDuck.makeSound();
strangeDuck.getName();
strangeDuck.fly();
strangeDuck.makeSound();
console.log('------------------');
simpleDuck.getName();
simpleDuck.fly();
simpleDuck.makeSound();
rubberDuck.getName();
rubberDuck.fly();
rubberDuck.makeSound();
strangeDuck.getName();
strangeDuck.fly();
strangeDuck.makeSound();
console.log('------------------');
</script>
</body>
</html>
// module
(function() {
'use strict';
// private
var _configs = {
simpleDuck: {
flyBehavior: 'default',
makeSoundBehavior: 'default'
},
rubberDuck: {
flyBehavior: 'dontFly',
makeSoundBehavior: 'pouet'
},
strangeDuck: {
flyBehavior: 'default',
makeSoundBehavior: 'pouet'
}
};
var _flyBehaviors = {
default: function() {
console.log(this.name + ': I can fly');
},
dontFly: function() {
console.log(this.name + ': I can\'t fly');
}
};
var _makeSoundBehaviors = {
default: function() {
console.log(this.name + ': Coin');
},
pouet: function() {
console.log(this.name + ': Pouet');
}
};
// object declaration
var Duck = function Duck(name) {
this.name = name;
// don't expose or make it safe (deep copy)
var _config = _configs[this.name];
// pattern strategy
this.fly = _flyBehaviors[_config.flyBehavior];
this.makeSound = _makeSoundBehaviors[_config.makeSoundBehavior];
};
Duck.prototype = {
// comomn methods
getName: function() {
console.log(this.name);
}
};
// expose constructor
window.Duck = Duck;
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment