深入理解23種設計模式 21 狀態模式

2021-10-20 04:31:31 字數 3185 閱讀 3668

狀態模式 (state pattern): 它主要是用來解決物件在多種狀態之間的轉換,需要對外輸出不同的行為的問題,狀態和行為是一一對應的,狀態之間可以互相轉換。

當乙個物件的內在狀態改變時,允許改變其行為,這個物件看起來是改變了其他類。

**活動:

假如每參加一次這個活動要扣除50積分,中獎概率是10%

獎品數量固定,抽完就不能**

活動又四個狀態:可以**、不能**、發放獎品和獎品已領完

建立 raffleactivity 類 相當於狀態模式中的 context

public

class

raffleactivity

public

void

debuctmoney()

public

void

raffle()

}public

intgetcount()

public

void

setcount

(int count)

public

void

setnorafflestate

(state norafflestate)

state getnorafflestate()

public state getcanrafflestate()

public

void

setcanrafflestate

(state canrafflestate)

public state getdispensestate()

public

void

setdispensestate

(state dispensestate)

public state getdispenseoutstate()

public

void

setdispenseoutstate

(state dispenseoutstate)

public state getstate()

public

void

setstate

(state state)

}

建立抽象介面

public

abstract

class

state

建立 初始化**活動 norafflestate 類繼承 state

public

class

norafflestate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

}

建立 正在**活動 canrafflestate 類繼承 state

public

class

canrafflestate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

else

}@override

public

void

dispenseprize()

}

建立 分發**活動 dispensestate 類繼承 state

public

class

dispensestate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

else

}}

建立 **活動分發完成 dispenseoutstate 類繼承 state

public

class

dispenseoutstate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

}

客戶端

優點:

1)結構清晰,避免了過多的switch…case或if…else語句的使用

2)很好的體現了開閉原則和單一職責原則,想要增加狀態就增加子類,想要修改狀態就修改子類即可

3)封裝性非常好,狀態變化放置到了類的內部來實現,外部呼叫不需要知道類內部如何實現狀態和行為的變換

缺點:

1)子類會太多,也即類膨脹
適用場景:

1)  一行為隨狀態改變而改變的場景 如 : 一日從早到晚自身的狀態,比如工作狀態、學習狀態等等

2) 條件、分支判斷語句的替代者

github demo位址 : ~~~傳送門~~~

深入理解23種設計模式 23 責任鏈模式

責任鏈模式 chain of responsibility pattern 為請求者建立乙個接受者物件的鏈,這種模式對請求對傳送者和請求者進行解耦。責任鏈模式通常每個接收者都包含對另乙個接收者都引用,如果乙個物件不能處理該請求,那麼他就會把相同的請求傳給下乙個接收者解耦,以此類推。這種型別的設計模式...

深入理解23種設計模式 9 外觀模式

外觀模式 facade pattern 門面模式,隱藏系統的複雜性,並向客戶端提供了乙個客戶端可以訪問系統的介面,這種型別的設計模式屬於結構型模式,他向現有的系統新增乙個介面,來隱藏系統的複雜性,這種模式涉及到乙個單一的類,該類提供類乙個客戶端請求的簡化方法和對現有系統類方法對委託呼叫 傳送郵件 p...

深入理解23種設計模式 13 命令模式

命令模式 command pattern 在軟體設計中,我們經常需要向某些物件傳送請求,但是並布置的請求的接收者是誰,也不知道被請求的操作是哪個,我們只需要程式執行時指定具體的請求接受者即可,此時,可以使用命令模式來進行設計 命令模式使得請求傳送者與請求接收者消標題 除彼此間的耦合,讓物件之間呼叫關...