設計模式之狀態模式

2021-10-06 17:20:19 字數 3127 閱讀 4262

本文根據尚矽谷韓順平老師的設計模式課程編寫設計模式

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

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

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

基本介紹

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

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

角色

context類為環境角色,用於維護state例項,這個例項定義當前狀態

state是抽象狀態角色,定義乙個介面封裝與context的乙個介面特點

concretestate具體的狀態,每個子類實現乙個與context的乙個狀態相關行為

**

//可以**的狀態

public

class

canrafflestate

extends

state

public

void

deductmoney()

public

boolean

raffle()

else

}@override

public

void

dispenseprize()

}

//獎品發放完畢狀態

//當我們的activity改變成dispenseoutstate**活動結束

public

class

dispenseoutstate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

}

public

class

dispensestate

extends

state

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

else

}}

//不能**的狀態

public

class

norafflestate

extends

state

// 當前狀態是可以扣積分的扣除後將狀態變為可以**狀態

@override

public

void

deductmoney()

@override

public

boolean

raffle()

@override

public

void

dispenseprize()

}

public

class

raffleactivity

public state getstate()

public

void

setstate

(state state)

public

intgetcount()

public

void

setcount

(int count)

public state getnorafflestate()

public

void

setnorafflestate

(state norafflestate)

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

void

debuctmoney()

public

void

raffle()

}}

//這裡是乙個抽象類,也可以是乙個介面

//public

abstract

class

state

public

class

client

}}

注意細節

**有很強的可讀性。狀態模式將每個狀態的行為封裝到對應的乙個類中

方便維護。將容易產生問題的if-else語句刪除了,如果把每個狀態的行為都放到乙個類中,每次呼叫方法時都要判斷當前是什麼狀態,不但會產出很多if-else語句,而且容易出錯

符合「開閉原則」。容易增刪狀態

會產生很多類。每個狀態都要- 乙個對應的類,當狀態過多時會產生很多類,加大維

護難度當乙個事件或者物件有很多種狀態,狀態之間會相互轉換,對不同的狀態要求有不同的行為的時候,可以考慮使用狀態模式

設計模式之狀態模式

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

設計模式之 狀態模式

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

設計模式之狀態模式

定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...