輕松掌握J(rèn)avaScript中介者模式
中介者模式的作用就是解除對(duì)象與對(duì)象之間的緊耦合關(guān)系,它也稱‘調(diào)停者'。所有的對(duì)象都通過中介者對(duì)象來通信,而不是相互引用,所以當(dāng)一個(gè)對(duì)象發(fā)生改變時(shí),只需要通知中介者即可。
如:機(jī)場(chǎng)的指揮塔,每架飛機(jī)都只需要和指揮塔通信即可,指揮塔知道每架飛機(jī)的飛行狀況,可以安排所有起降時(shí)間,調(diào)整航線等
中介者模式符合迪米特法則,即最少知識(shí)原則,指一個(gè)對(duì)象應(yīng)該盡可能少地了解另外的對(duì)象。如果對(duì)象之間的耦合性太高,則改變一個(gè)對(duì)象,會(huì)牽動(dòng)很多對(duì)象,難于維護(hù)。當(dāng)對(duì)象耦合很緊時(shí),要修改一個(gè)對(duì)象而不影響其它的對(duì)象是很困難的。
如果對(duì)象之間的復(fù)雜耦合確實(shí)導(dǎo)致調(diào)用和維護(hù)出現(xiàn)了困難,而且這些耦合度隨項(xiàng)目的變化呈指數(shù)增長(zhǎng),那我們就可以考慮用中介者模式來重構(gòu)代碼!中介者通過解耦來提升代碼的可維護(hù)性。
例子1:游戲
玩家對(duì)象是通過Player()構(gòu)造函數(shù)來創(chuàng)建的,有自己的points和name屬性。原型上的play()方法負(fù)責(zé)給自己加一分然后通知中介者:
function Player(name) { this.points = 0; this.name = name; } Player.prototype.play = function () { this.points += 1; mediator.played(); };
scoreboard對(duì)象(計(jì)分板)有一個(gè)update()方法,它會(huì)在每次玩家玩完后被中介者調(diào)用。計(jì)分析根本不知道玩家的任何信息,也不保存分?jǐn)?shù),它只負(fù)責(zé)顯示中介者給過來的分?jǐn)?shù):
var scoreboard = { element: document.getElementById('results'), 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; } };
現(xiàn)在我們來看一下mediator對(duì)象(中介者)。在游戲初始化的時(shí)候,在setup()方法中創(chuàng)建游戲者,然后放后players屬性以便后續(xù)使用。played()方法會(huì)被游戲者在每輪玩完后調(diào)用,它更新score哈希然表然后將它傳給scoreboard用于顯示。最后一個(gè)方法是keypress(),負(fù)責(zé)處理鍵盤事件,決定是哪位玩家玩的,并且通知它:
var mediator = { players: {}, setup: function () { var players = this.players; players.home = new Player('Home'); players.guest = new Player('Guest'); }, played: function () { var players = this.players, score = { Home: players.home.points, Guest: players.guest.points }; scoreboard.update(score); }, 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; } } };
最后一件事是初始化和結(jié)束游戲:
// go! mediator.setup(); window.onkeypress = mediator.keypress; // game over in 30 seconds setTimeout(function () { window.onkeypress = null; alert('Game over!'); }, 30000);
例子2:賣手機(jī)
var goods = { //庫存 'red|32G':3, 'red|16G':5, 'blue|32G':3, 'blue|16G':6 } //中介者 var mediator = (function(){ function id(id){ return document.getElementById(id); } var colorSelect = id('colorSelect'), memorySelect = id('memorySelect'), numberInput = id('numberInput'), colorInfo = id('colorInfo'), memoryInfo = id('memoryInfo'), numberInfo = id('numberInfo'), nextBtn = id('nextBtn'); return{ changed:function(obj){ var color = colorSelect.value, memory = memorySelect.value, number = numberInput.value, stock = goods[color+'|'+memory]; if(obj === colorSelect){ colorInfo.innerHTML = color; }else if(obj === memorySelect){ memoryInfo.innerHTML = memory; }else if(obj === numberInput){ numberInfo.innerHTML = number; } if(!color){ nextBtn.disabled = true; nextBtn.innerHTML = '請(qǐng)選擇手機(jī)顏色'; return; } if(!memory){ nextBtn.disabled = true; nextBtn.innerHTML = '請(qǐng)選擇內(nèi)存大小'; return; } if(Number.isInteger(number-0) && number > 0){ nextBtn.disabled = true; nextBtn.innerHTML = '請(qǐng)輸入正確的購買數(shù)量'; return; } nextBtn.disabled = false; nextBtn.innerHTML = '放入購物車'; } } })(); //添加事件 colorSelect.onchange = function(){ mediator.changed(this); } memorySelect.onchange = function(){ mediator.changed(this); } numberInput.onchange = function(){ mediator.changed(this); }
參考文獻(xiàn): 《JavaScript模式》 《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
window.addeventjs事件驅(qū)動(dòng)函數(shù)集合addEvent等
addEvent()、removeEvent()、handleEvent()、fixEvent()[2008-02-02canvas實(shí)現(xiàn)動(dòng)態(tài)小球重疊效果
在javascript運(yùn)動(dòng)系列中,詳細(xì)介紹了各種運(yùn)動(dòng),其中就包括碰壁運(yùn)動(dòng)。但是,如果用canvas去實(shí)現(xiàn),卻是另一種思路。本文將詳細(xì)介紹canvas動(dòng)態(tài)小球重疊效果。下面跟著小編一起來看下吧2017-02-02JavaScript中split與join函數(shù)的進(jìn)階使用技巧
這篇文章主要介紹了JavaScript中split與join函數(shù)的進(jìn)階使用技巧,split和join通常被用來操作數(shù)組和字符串之間的轉(zhuǎn)換,需要的朋友可以參考下2016-05-05基于javascript實(shí)現(xiàn)數(shù)字英文驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)數(shù)字英文驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01