javascript常見的設(shè)計模式舉例
本文關(guān)鍵詞:JavaScript設(shè)計模式,由筆耕文化傳播整理發(fā)布。
近日重讀《javascript面型對象編程指南》這本書,最后一章介紹了常見的JavaScript設(shè)計模式的實(shí)現(xiàn)。主要講解了四種設(shè)計模式:單例模式、工廠模式、裝飾器模式和觀察者模式。js作為動態(tài)語言,實(shí)現(xiàn)這四種模式的實(shí)例相對簡單,當(dāng)然既然稱之為模式,那么吃透思想更重要,那么下面,由樂帝來實(shí)例講解四種模式。
1.單例模式
顧名思義,對象構(gòu)造出來的是實(shí)例,從字面上理解,單例即單實(shí)例,這意味一個類只能創(chuàng)建一個實(shí)例對象。當(dāng)需要創(chuàng)建一種類型或者一個類的唯一對象時,可使用該模式。以下兩個實(shí)例分別從全局變量和類屬性兩種角度構(gòu)造單例。屬于對象創(chuàng)建型模式。
function Logger(){ if(typeof global_log==="undefined") { global_log=this;//沒有在函數(shù)內(nèi)定義global_log所以被看成全局變量,并且此時this為window為全局對象 alert(this);//相當(dāng)于初始化全局變量并且賦值為window,由于全局變量有唯一性,故可保證單例 } return global_log;//但問題在于全局變量有可能被覆蓋掉,造成實(shí)例流失 } var a = new Logger(); var b = new Logger(); console.log(a===b);//另外一種單例模式:構(gòu)造器屬性 function Logger(){//從面向?qū)ο蟮慕嵌瓤紤],Logger是一個類 if(typeof Logger.single_instance==="undefined"){ Logger.single_instance=this;//Logger.single_instance則是類屬性,這個也可以實(shí)現(xiàn)單例,類屬性和私有屬性不同,類屬性是類實(shí)例公用的 alert(this); } return Logger.single_instance; } var a=new Logger() var b=new Logger() a===b;
2.工廠模式
總的來說,工廠模式屬于創(chuàng)建對象型模式,當(dāng)有多個相似對象不知用哪種,可以考慮工廠模式。也屬于創(chuàng)建型模式。
3.裝飾器模式
此種模式是一種結(jié)構(gòu)型模式,主要考慮如何拓展對象的功能?梢詾橐粋基礎(chǔ)對象創(chuàng)建若干裝飾器對象以拓展其功能。由我們的程序自行選擇不同裝飾器,并使用它們。
var tree={}; tree.decorate=function(){ alert("make sure the tree will not fall"); } tree.getDecorator=function(deco){ tree[deco].prototype=this;//返回新對象并且原tree作為新對象的原型對象 return new tree[deco]; }; tree.RedBalls=function(){//tree的redball屬性也是對象 this.decorate=function(){ this.RedBalls.prototype.decorate();//首先調(diào)用原型對象decorate方法 alert("put on some red ball"); } }; tree.BlueBalls=function(){ this.decorate=function(){ this.BlueBalls.prototype.decorate();//首先調(diào)用原型對象decorate方法 alert("add blue ball"); } }; tree.Angel=function(){ this.decorate=function(){ this.Angel.prototype.decorate();//首先調(diào)用原型對象decorate方法 alert("an angel on the top"); } };//以上三個裝飾器可按照需要選擇 tree=tree.getDecorator("BlueBalls");//返回new tree["BlueBall"],并且保留對tree作為原型對象 tree=tree.getDecorator("RedBalls");//下兩個類似 tree=tree.getDecorator("Angel"); tree.decorate();//當(dāng)調(diào)用最后的decorate方法時,,會分別上溯調(diào)用各自decorate方法中的原型對象方法調(diào)用 //裝飾器模式的實(shí)現(xiàn),關(guān)鍵在構(gòu)造新對象時不斷保留原對象作為原型對象,同時新對象的方法中,不斷調(diào)用原型對象的同名方法 //總的來說就是保存原有對象功能的前提下,不斷添加新的功能到原有對象4.觀察者模式
此種模式屬于行為型模式,主要處理對象之間的交互通信的問題。通常包含兩類對象:發(fā)行商和訂閱商。
//觀察者模式 //觀察者模式分為推送和拉動兩類,推送模式是由發(fā)行商負(fù)責(zé)將消息通知給各個訂閱者,以下為推送模式實(shí)例 var observer={//觀察這對象 addSubscriber:function(callback){ this.subscribers[this.subscribers.length]=callback; },//添加訂閱者 removeSubscriber:function(callback){ for(var i=0;i
本文關(guān)鍵詞:JavaScript設(shè)計模式,由筆耕文化傳播整理發(fā)布。
本文編號:339355
本文鏈接:http://sikaile.net/wenshubaike/mishujinen/339355.html