當乙個物件在內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類;
行為型模式從網上找到的例圖
/**
* created by george on 16/7/10.
*///電梯狀態
function liftstate () ;
// 開門
this.open = function () ;
// 關門
this.close = function () ;
// 執行
this.running = function () ;
// 停止
this.idle = function () ;
};//環境類
function context () ;
this.setliftstate = function (state) ;
// 更改狀態
this.open = function () ;
this.close = function () ;
this.running = function () ;
this.idle = function () ;
};// 具體開門狀態
function openstate () ;
openstate.prototype = new liftstate();
openstate.prototype.close = function () ;
// 關門狀態
function closestate () ;
closestate.prototype = new liftstate();
closestate.prototype.running = function () ;
closestate.prototype.idle = function () ;
// 執行狀態
function runningstate () ;
runningstate.prototype = new liftstate();
runningstate.prototype.idle = function () ;
// 空閒狀態
function idlestate() ;
idlestate.prototype = new liftstate();
idlestate.prototype.open = function () ;
// 主函式
var context = new context();
context.setliftstate(new idlestate());
// 大概操作的意思是先處於限制狀態,然後再開門,關上門,然後執行,到達後至於限制,最後開門
context.open();
context.close();
context.running();
context.idle();
context.open();
封裝了轉換原則;
將所有與某個狀態有關的行為放到乙個類中,並且可以方便的增加新的狀態,只需要改變物件狀態即可改變物件的行為;
允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊;
可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數;
注意的是必然會增加系統類和物件的個數;
結構和實現都較為複雜,如果使用不當將會導致程式結構和**的混亂;
對「開閉原則」的支援並不太好,對於可以切換狀態的的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的**,否則無法切換到新增狀態,而且修改某個狀態類的行為需要修改對應類的**;
狀態模式 詳解
當乙個物件在內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類 行為型模式 從網上找到的例圖 電梯狀態 function liftstate 開門 this.open function 關門 this.close function 執行 this.running function 停止 th...
C 設計模式 狀態模式詳解
狀態模式 當乙個物件內在狀態改變時允許改變其行為,看起來像改變了棋類。狀態模式,顧名思義就是表示乙個物件的狀態,並且這些狀態不一定是互斥的,常見的比如手機狀態,有開機 關機 沒有訊號 正在通話。這四種狀態中,比如手機處於關機狀態時,就不能進行通話,只能進行開機 手機沒有訊號的時候,就不能進行打 只能...
C 設計模式 State 狀態模式詳解
狀態模式的適用場景 狀態模式的優缺點 狀態模式用於解決系統中複雜物件的狀態轉換以及不同狀態下行為的封裝問題。當系統中某個物件存在多個狀態,這些狀態之間可以進行轉換,而且物件在不同狀態下行為不相同時可以使用狀態模式。狀態模式將乙個物件的狀態從該物件中分離出來,封裝到專門的狀態類中,使得物件狀態可以靈活...