設計模式之狀態模式

2021-07-03 12:55:45 字數 2898 閱讀 5106

定義:允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。

類圖:

說明:context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態;state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特定狀態相關的行為;concretestatea和concretestateb表示具體狀態類,每乙個具體狀態類實現乙個與context的乙個狀態相關的行為。

優點:

①.封裝了狀態的轉換機制,可以對狀態轉換**進行集中管理,而不是分散在乙個個業務方法中

②.將所有與某個狀態有關的行為放到乙個類中,只需要注入乙個不同的狀態物件即可使用環境物件擁有不同的行為

③.允許狀態轉換邏輯與狀態物件合成一體,而不是提供乙個巨大的條件語句塊,可以避免使用龐大的條件語句來將業務方法狀態轉換**交織在一起

④.可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數

缺點:

①.會增加系統中類和物件的個數,導致系統執行開銷增大

②.結構與實現都較為複雜,如果使用不當將導致程式結構和**混亂,增加系統設計的難度

③.對開閉原則的支援並不太好,增加新的狀態類需要修改負責狀態的源**,否則無法轉換到新增狀態;而且修改某個狀態類的行為也需要對應類的源**。

適用環境:

①.物件的行為依賴於它的狀態(如某些屬性值),狀態的改變將導致行為的改變

②.在**中包含大量與物件狀態有關的條件語句,這些條件語句的出現會導致**可維護性和靈活性變差,不能方便地增加和刪除狀態,並且導致客戶端類與類庫之間的耦合增強

例項場景:狀態例項模式之銀行賬戶,我們定義了賬戶的三種狀態:①如果賬戶中餘額大於等於0,此時賬戶的狀態為綠色,即為正常狀態,表示既可以想賬戶存款,也可以從該賬戶取款。②如果賬戶中餘額小於0,並且大於-1000,則賬戶的狀態為黃色,即為欠費狀態,表示既可以取款也可以存款③如果賬戶中餘額小於-1000,那麼賬戶的狀態為紅色,即為透支狀態,此時使用者只能向該賬戶存款,不能取款。

例項類圖:

例項**:

//狀態類

/**

* 抽象狀態類

* @author fly

* */

public abstract class accountstate

/**

* 綠色狀態類:具體狀態類

* @author fly

* */

public class greenstate extends accountstate

public greenstate(double balance,account account)

@override

public void deposit(double amount)

@override

public void withdraw(double amount)

@override

public void statecheck() else if(balance

}}

/**

* 黃色狀態類:具體狀態類

* @author fly

* */

public class yellowstate extends accountstate

@override

public void deposit(double amount)

@override

public void withdraw(double amount)

@override

public void statecheck() else if(balance

}}

/**

* 紅色狀態類:具體狀態類

* @author fly

* */

public class redstate extends accountstate

@override

public void deposit(double amount)

@override

public void withdraw(double amount)

@override

public void statecheck() else if(balance>=-1000)

}}

//銀行賬戶

/**

* 銀行賬戶:環境類

* * @author fly

* */

class account

public void setstate(accountstate state)

public void deposit(double amount)

public void withdraw(double amount)

}

//客戶端測試

public class client 

}

//執行結果:

設計模式之狀態模式

一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...

設計模式之 狀態模式

gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...

設計模式之狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一系列類中,可以把複雜的判斷簡單化。public abstract class state public cl...