JavaScript設計模式經典之代理模式

z_paul發表於2021-09-09

代理模式的定義是把對一個物件的訪問, 交給另一個代理物件來操作.

舉一個例子, 我在追一個MM想給她送一束花,但是我因為我性格比較靦腆,所以我託付了MM的一個好朋友來送。

這個例子不是非常好, 至少我們沒看出代理模式有什麼大的用處,因為追MM更好的方式是送一臺寶馬。

再舉個例子,假如我每天都得寫工作日報( 其實沒有這麼慘 ). 我的日報最後會讓總監審閱. 如果我們都直接把日報發給 總監 , 那可能 總監 就沒法工作了. 所以通常的做法是把日報發給我的組長 , 組長把所有組員一週的日報都彙總後再發給總監 .

實際的程式設計中, 這種因為效能問題使用代理模式的機會是非常多的。比如頻繁的訪問dom節點, 頻繁的請求遠端資源. 可以把操作先存到一個緩衝區, 然後自己選擇真正的觸發時機.

再來個詳細的例子,之前我寫了一個街頭霸王的遊戲, 地址在

遊戲中需要接受鍵盤的事件, 來完成相應動作.

於是我寫了一個keyManage類. 其中在遊戲主執行緒裡監聽keyManage的變化.

var keyMgr = keyManage();

keyMgr.listen( ”change’, function( keyCode ){

console.log( keyCode );

});

圖片裡面隆正在放升龍拳, 升龍拳的操作是前下前+拳. 但是這個keyManage類只要發生鍵盤事件就會觸發之前監聽的change函式. 這意味著永遠只能取得前,後,前,拳這樣單獨的按鍵事件,而無法得到一個按鍵組合。

好吧,我決定改寫我的keyManage類, 讓它也支援傳遞按鍵組合. 但是如果我以後寫個html5版雙截龍,意味著我每次都得改寫keyManage. 我總是覺得, 這種函式應該可以抽象成一個更底層的方法, 讓任何遊戲都可以用上它.

所以最後的keyManage只負責對映鍵盤事件. 而隆接受到的動作是透過一個代理物件處理之後的.

var keyMgr = keyManage();

keyMgr.listen( ”change’, proxy( function( keyCode ){

console.log( keyCode );  //前下前+拳

)} );

至於proxy裡面怎麼實現,完全可以自由發揮。

還有個例子就是在呼叫ajax請求的時候,無論是各種開源庫,還是自己寫的Ajax類, 都會給xhr物件設定一個代理. 我們不可能頻繁的去操作xhr物件發請求, 而應該是這樣.

var request = Ajax.get( ‘cgi.xx.com/xxx’ );

request.send();

request.done(function(){

});


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2803509/,如需轉載,請註明出處,否則將追究法律責任。

相關文章