Skip to content

Instantly share code, notes, and snippets.

@rochnyak-d-i
Created October 28, 2014 05:01
Show Gist options
  • Save rochnyak-d-i/035843a9401fe1386a2c to your computer and use it in GitHub Desktop.
Save rochnyak-d-i/035843a9401fe1386a2c to your computer and use it in GitHub Desktop.
JS шаблон медиатор
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