Created
October 28, 2014 05:01
-
-
Save rochnyak-d-i/035843a9401fe1386a2c to your computer and use it in GitHub Desktop.
JS шаблон медиатор
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var mediator = (function() { | |
var subscribe = function(channel, fn) { | |
if (!mediator.channels[channel]) mediator.channels[channel] = []; | |
mediator.channels[channel].push({ context: this, callback: fn }); | |
return this; | |
}, | |
publish = function(channel) { | |
if (!mediator.channels[channel]) return false; | |
var args = Array.prototype.slice.call(arguments, 1); | |
for (var i = 0, l = mediator.channels[channel].length; i < l; i++) { | |
var subscription = mediator.channels[channel][i]; | |
subscription.callback.apply(subscription.context, args); | |
} | |
return this; | |
}; | |
return { | |
channels: {}, | |
publish: publish, | |
subscribe: subscribe, | |
installTo: function(obj) { | |
obj.subscribe = subscribe; | |
obj.publish = publish; | |
} | |
}; | |
}()); | |
//примеры работы | |
//Pub/sub on a centralized mediator | |
mediator.name = "tim"; | |
mediator.subscribe('nameChange', function(arg) { | |
console.log(this.name); | |
this.name = arg; | |
console.log(this.name); | |
}); | |
mediator.publish('nameChange', 'david'); //tim, david | |
//Pub/sub via third party mediator | |
var obj = {name: 'sam'}; | |
mediator.installTo(obj); | |
obj.subscribe('nameChange', function(arg) { | |
console.log(this.name); | |
this.name = arg; | |
console.log(this.name); | |
}); | |
obj.publish('nameChange', 'john'); //sam, john | |
//пример первый | |
function Daddy() { } | |
Daddy.prototype = | |
{ | |
constructor: Daddy, | |
getBeer: function () | |
{ | |
if (!kitchen.tryToGetBeer()) | |
{ | |
console.log("Daddy: Who the hell drank all my beer?"); | |
return false; | |
} | |
console.log("Daddy: Yeeah! My beer!"); | |
kitchen.oneBeerHasGone(); | |
return true; | |
}, | |
argue_back: function () { console.log("Daddy: it's my last beer, for shure!"); } | |
} | |
function Mammy() { } | |
Mammy.prototype = | |
{ | |
constructor: Mammy, | |
argue: function () | |
{ | |
console.log("Mammy: You are f*king alconaut!"); | |
kitchen.disputeStarted(); | |
} | |
} | |
function BeerStorage(beer_bottle_count) | |
{ | |
this._beer_bottle_count = beer_bottle_count; | |
} | |
BeerStorage.prototype = | |
{ | |
constructor: BeerStorage, | |
takeOneBeerAway: function () | |
{ | |
if (this._beer_bottle_count == 0) return false; | |
this._beer_bottle_count--; | |
return true; | |
} | |
} | |
var kitchen = | |
{ | |
daddy: new Daddy(), | |
mammy: new Mammy(), | |
refrigerator: new BeerStorage(3), | |
stash: new BeerStorage(2), | |
tryToGetBeer: function () | |
{ | |
if (this.refrigerator.takeOneBeerAway()) return true; | |
if (this.stash.takeOneBeerAway()) return true; | |
return false | |
}, | |
oneBeerHasGone: function (){ this.mammy.argue(); }, | |
disputeStarted: function (){ this.daddy.argue_back(); } | |
} | |
var round_counter = 0; | |
while (kitchen.daddy.getBeer()) | |
{ | |
round_counter++ | |
console.log( round_counter + " round passed"); | |
} | |
//пример второй | |
function Player(name) { | |
this.points = 0; | |
this.name = name; | |
} | |
Player.prototype.play = function () { | |
this.points += 1; | |
mediator.played(); | |
}; | |
var scoreboard = { | |
// HTML element to be updated | |
element:document.getElementById('results'), | |
// update the score display | |
update:function (score) { | |
var i, msg = ''; | |
for (i in score) { | |
if (score.hasOwnProperty(i)) { | |
msg += '<p><strong>' + i + '<\/strong>: '; | |
msg += score[i]; | |
msg += '<\/p>'; | |
} | |
} | |
this.element.innerHTML = msg; | |
} | |
}; | |
var mediator = { | |
// all the player | |
players:{}, | |
// initialization | |
setup:function () { | |
var players = this.players; | |
players.home = new Player('Home'); | |
players.guest = new Player('Guest'); | |
}, | |
// someone plays, update the score | |
played:function () { | |
var players = this.players, | |
score = { | |
Home:players.home.points, | |
Guest:players.guest.points | |
}; | |
scoreboard.update(score); | |
}, | |
// handle user interactions | |
keypress:function (e) { | |
e = e || window.event; // IE | |
if (e.which === 49) { // key "1" | |
mediator.players.home.play(); | |
return; | |
} | |
if (e.which === 48) { // key "0" | |
mediator.players.guest.play(); | |
return; | |
} | |
} | |
}; | |
// go! | |
mediator.setup(); | |
window.onkeypress = mediator.keypress; | |
// game over in 30 seconds | |
setTimeout(function () { | |
window.onkeypress = null; | |
console.log('Game over!'); | |
}, 30000); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment