Я не уверен, как реализовать этот шаблон для создания различных аур.
Один Hase, чтобы принять решение, либо проектировании Aura
constructor-/завод на основе и не отрезая прототипичные делегации, чтобы быть в состоянии идти позже для более вариаций ауры использования наследования или разложения полнофункциональный Aura
в различные смесины, каждый из которых имеет четко определенный набор мелкозернистого поведения .
базировался Экземпляр аура подход наиболее Propably усложняется, когда он опирается на переадресацию, если один будет «добавить» экземпляр ауры (что в данном примере способен случае диспетчерских) на характер ... MyCharacter.addAura(new MyAura(any, args))
... Метод конструктора игрока должен быть реализован способом , который уже учитывает, что аура сама по себе включает в себя методы, связанные с событиями. Таким образом, этот код должен придумать собственное решение для переадресации, чтобы включить игрока, отправляющего события на время проведения ауры.
Следующая дается сводились но работает пример (ы) может указывать на то, что только что было сказано ...
var Player = (function() { // sort of factory module implementation.
var
// ...
// ...
addAura = function (player, aura) { // simplified forwarding or delegation.
// ...
player.on = function (type, handler) {
aura.on(type, handler); // forwarding.
// please try switching it to delegation ...
//aura.on.apply(player, arguments); // delegation.
//aura.on.call(player, type, handler); // delegation.
console.log("player.on :: player.getName() ", player.getName());
};
// ...
},
Constructor = function Player (name) {
// ...
// ...
this.getName = function() {
return name;
};
//this.addAura = function (aura) {
// addAura(this, aura)
//};
},
createPlayer = function (config) { // factory.
var
// ...
//player = (new Constructor)
player = (new Constructor(config.name))
// ...
;
//player.name = config.name;
player.addAura = function (aura) {
addAura(player, aura)
};
return player;
}
;
return {
create: createPlayer
};
}());
...
var // simplified aura object - for demonstration only.
aura = {
on: function (type, handler) {
if (typeof handler == "function") {
handler.call(this);
}
console.log("aura :: on - [this, arguments] ", this, arguments);
}
},
p1 = Player.create({name:"p1"}), // 1st character/player.
p2 = Player.create({name:"p2"}) // 2nd character/player.
;
...
p1.addAura(aura);
p2.addAura(aura);
p1.on("tick", function() {console.log("tick :: this", this);});
p2.on("remove", function() {console.log("remove :: this", this);});
Для всех вышеперечисленных, я лично всегда предпочитаю функцию, основанную на методе смешивания микширования .
Дело выпрыгнув мне, что, если я не неправильно, события быть включен на и применяется к классу игрока, а не сам объект Aura.
Если следовать подходу дело только с плеера/символа экземпляров, тогда как все остальное, что можно рассматривать как набор дополнительных поведения, которые игрок может приобрести или может избавиться от (или которые могут быть награждены или может быть снят с любого игрока) во время выполнения, затем для последнего, говорится о ролевой композиции. Таким образом, и Observable
, и Aura
являются миксинами.
Не будет такой вещи, как объект ауры.
Если игрок уже не имеет наблюдаемое поведения, но поведения ауры действительно полагается на него, то Aura
Mixin должен использовать прежний. Тогда фабрика игрока не имеет дело с Observable
, но объект игрока будет иметь поведение Observable
, как только на него будет применен миксин Aura
.
... и теперь возвращаться снова ...
Я не уверен, как я бы реализовать этот шаблон, чтобы создать различную ауру.
Придерживаясь функциональных миксинов, в основном используются два решения. Во-первых, как и в примере, который я привел в своем первом ответе, можно использовать для подошву, но настраиваемый Mixin. Или, во-вторых, кто-то предпочитает уже упомянутые мно- гие фрагменты ауры.
var $rpg = { // mocking and faking heavily.
Event: {
enable: function (observable) {
observable.on = function (type, handler) {
if (typeof handler == "function") {
handler.call(this);
}
console.log("aura :: on - [this, arguments] ", this, arguments);
};
return observable;
}
}
};
...
var withAuraBase = function AuraBaseMixin (group) { // not a constructor but a simple function based "flight mixin".
var auraEnabled = this;
// ...
$rpg.Event.enable(auraEnabled);
// ...
auraEnabled.group = group;
// ...
};
var withFencinessFactorAura = function FencinessFactorAuraMixin (fencinessFactor) {
// ...
this.fencinessFactor = fencinessFactor;
// ...
};
var withCheatingFeaturesAura = function CheatingFeaturesAuraMixin (config) {
// ...
this.cheatingFeatures = config;
// ...
};
Player
завод код из выше, то сократится до ...
var Player = (function() { // sort of factory module implementation.
var
// ...
// ...
Constructor = function Player (name) {
// ...
// ...
this.getName = function() {
return name;
};
},
createPlayer = function (config) { // factory.
var
// ...
player = (new Constructor(config.name))
// ...
;
//player.name = config.name;
return player;
}
;
return {
create: createPlayer
};
}());
...
var
p1 = Player.create({name:"player1"}), // 1st character/player.
p2 = Player.create({name:"player2"}) // 2nd character/player.
;
// applying mixin examples differently.
withAuraBase.call(p1, "classification");
withAuraBase.call(p2, "classification");
withFencinessFactorAura.call(p1, 10);
withCheatingFeaturesAura.call(p2, {/*cheatingFeaturesConfig*/});
console.log("p1.getName(), p1", p1.getName(), p1);
console.log("p2.getName(), p2", p2.getName(), p2);
p1.on("tick", function() {console.log("tick :: this", this);});
p2.on("remove", function() {console.log("remove :: this", this);});
Подсказка: " meta "mixins также может быть легко cons созданных из меньших. Таким образом, создание композиций поведенческих наборов.
var withFencyAura = function FencyAurMixin (group, fencinessFactor) {
var auraEnabled = this;
withAuraBase.call(auraEnabled, group);
withFencinessFactorAura.call(auraEnabled, fencinessFactor);
};
var withCheatingAura = function CheatingAuraMixin (group, config) {
var auraEnabled = this;
withAuraBase.call(auraEnabled, group);
withCheatingFeaturesAura.call(auraEnabled, config);
};
Примечания: На практике я в основном в конечном итоге с настраиваемым Mixins, в то время как выше приведен пример составления Примеси из другого Mixins, кажется, редкий случай.
Вы можете также изменить mixin так, чтобы он лениво инициировал элемент '_events' на объекте (когда вызывается' on'). Это подход, используемый [asEvented] (https://github.com/mkuklis/asEvented/blob/master/asevented.js). – plalx
Как насчет композиционного подхода к миксинам? 'Aura = eventMixin.mixInto (Aura);' где это применяется mixin и возвращает новый сложенный конструктор. Единственное, что с этим связано, это приложение mixin не может быть отложено, так как на данный момент никто не должен ссылаться на старый конструктор. – plalx
Спасибо за ваши комментарии. Я думал о создании экземпляров событий, как вы описали, я не совсем уверен, что оттолкнуло меня от этой идеи, так что это может быть то, что я использую в конце концов. Не могли бы вы уточнить, что вы подразумеваете под «композиционным»? – Traverse