Вчера я начал разбираться, и будто бы, начал что-то понимать, (спасибо всем откликнувшимся, отдельное спасибо TDrive), но сегодня решил разобрать следующий пример, и снова впал в какой то ступор.
взято отсюда: http://habrahabr.ru/post/191480/
// Greeter - класс объектов, которые могут приветствовать людей.
// Он может выучить различные способы приветствия через стратегии
var Greeter = function(strategy) {
this.strategy = strategy;
};
// Greeter содержит функцию greet,
// которая будет использоваться для приветствия людей
// через стратегии, переданные в конструктор
Greeter.prototype.greet = function() {
return this.strategy();
};
// Так как функция инкапсулирует алгоритм,
// она отличный кандидат на роль стратегии
// Немного стратегий:
var politeGreetingStrategy = function() {
console.log("Hello.");
};
var friendlyGreetingStrategy = function() {
console.log("Hey!");
};
var boredGreetingStrategy = function() {
console.log("sup.");
};
// Давайте используем их!
var politeGreeter = new Greeter(politeGreetingStrategy);
var friendlyGreeter = new Greeter(friendlyGreetingStrategy);
var boredGreeter = new Greeter(boredGreetingStrategy);
Код, воистину элементарен.
Все это можно переписать вот так
Greeter=function(strategy){this.strategy=strategy}
Greeter.prototype.greet=function(){this.strategy()}
politeGreeter=new Greeter(function(){console.log("Hello")})
friendlyGreeter=new Greeter(function(){console.log("Hey")})
boredGreeter=new Greeter(function(){console.log("sup")})
Мало того, для выражения данной абстракции, даж этот код избыточен. Я его привел просто для того, чтобы была полная семантическая эквивалентность. А по хорошему, это стоило бы записать вот так
Greeter=function(greeting){this.greeting=greeting}
Greeter.prototype.greet=function(){console.log(this.greeting)}
politeGreeter=new Greeter("Hello")
friendlyGreeter=new Greeter("Hey!")
boredGreeter=new Greeter("sup")
А может нет никакой «стратегии», а? Может это фантом коллективного-бессознательного?