javascript設計模式 – 狀態(tài)模式原理與用法實例分析
本文實例講述了javascript設計模式 – 狀態(tài)模式原理與用法。分享給大家供大家參考,具體如下:
介紹:狀態(tài)模式用于解決系統(tǒng)中復雜對象的狀態(tài)轉(zhuǎn)換以及不同狀態(tài)下行為的封裝問題。狀態(tài)模式將一個對象的狀態(tài)從該對象中分離出來,使得對象狀態(tài)可以靈活變化。
定義:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為,對象看起來似乎修改了它的類,其別名為狀態(tài)對象,狀態(tài)模式是一種對象行為型模式。
場景:在很多情況下我們的頁面需要做一些狀態(tài)判斷,是否注冊,是否登錄,剩余金額是否大于500等等,我們通常是在組件中通過if…else…來做不同的處理,這種方式耦合嚴重不滿足單一職責原則。如何解決這個問題呢,這一節(jié)我們利用狀態(tài)模式來解決對象的狀態(tài)切換。
示例:
var Dialog = function(){
var _state = null;
this.setState = function(state){
_state = state;
}
this.getState = function(){
return _state;
}
}
var ShowState = function(){
this.doAction = function(dialog){
console.log("對Dialog設置顯示狀態(tài):");
dialog.setState(this);
}
this.toString = function(){
console.log("顯示中......");
}
}
var HideState = function(){
this.doAction = function(dialog){
console.log("對Dialog設置隱藏狀態(tài):");
dialog.setState(this);
}
this.toString = function(){
console.log("已隱藏......");
}
}
var dialog = new Dialog();
var showState = new ShowState();
var hideState = new HideState();
showState.doAction(dialog);
//對Dialog設置顯示狀態(tài):
dialog.getState().toString();
//顯示中......
hideState.doAction(dialog);
//對Dialog設置隱藏狀態(tài)
dialog.getState().toString();
//已隱藏......
這個例子里Dialog對象有兩種狀態(tài),顯示和隱藏,我把兩種狀態(tài)提取出來,使得狀態(tài)的管理更加靈活。在這個例子里面Dialog稱之為環(huán)境類,環(huán)境類又稱為上下文類,他擁有多種狀態(tài)。環(huán)境類內(nèi)部需要維護一個state對象用來定義當前狀態(tài)。HideState,ShowState稱之為狀態(tài)類,對應環(huán)境類的一個具體狀態(tài),toString稱之為狀態(tài)類的行為,每一個狀態(tài)類的行為都有所不同。
狀態(tài)模式總結(jié):
優(yōu)點:
* 封裝了狀態(tài)的轉(zhuǎn)換規(guī)則,在狀態(tài)模式中可以將狀態(tài)的轉(zhuǎn)換代碼封裝在環(huán)境類或者具體狀態(tài)類中,方便對狀態(tài)轉(zhuǎn)換代碼進行管理。
* 將所有與某個狀態(tài)有關(guān)的行為放到一個類中,只需要注入一個不同的狀態(tài)對象即可使環(huán)境對象擁有不同行為
缺點:
* 狀態(tài)模式的使用必然會增加系統(tǒng)中狀態(tài)類的數(shù)量,導致開銷變大。
* 結(jié)構(gòu)設計交付為咋,使用不當會導致程序結(jié)構(gòu)和代碼混亂,增加系統(tǒng)設計難度。
適用場景:
* 對象的行為依賴于它的狀態(tài),狀態(tài)改變將導致行為的變化
* 在代碼中包含大量與對象狀態(tài)有關(guān)的條件語句
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學運算用法總結(jié)》
希望本文所述對大家JavaScript程序設計有所幫助。
相關(guān)文章
JavaScript實現(xiàn)將xml轉(zhuǎn)換成html table表格的方法
這篇文章主要介紹了JavaScript實現(xiàn)將xml轉(zhuǎn)換成html table表格的方法,實例分析了javascript操作XML文件與table表格的技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
JavaScript 替換所有匹配內(nèi)容及正則替換方法
這篇文章主要介紹了JavaScript 替換所有匹配內(nèi)容,文中給大家提到了使用正則表達式替換方法,通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2020-02-02
JavaScript使用localStorage存儲數(shù)據(jù)
這篇文章主要為大家詳細介紹了JavaScript使用localStorage存儲數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
javascript RadioButtonList獲取選中值
js獲取RadioButtonList值的代碼。2009-04-04
html5+javascript實現(xiàn)簡單上傳的注意細節(jié)
這篇文章主要為大家詳細介紹了html5+javascript實現(xiàn)上傳操作的注意細節(jié),form表單樣式不美觀等細節(jié)問題,感興趣的小伙伴們可以參考一下2016-04-04

