行為型設計模式之狀態模式(State)

2021-10-06 05:49:52 字數 4168 閱讀 1824

這裡我們用汽車的運動過程來作為乙個示例講解,首先看一段最初始的**:

public

class

state_01

public

void

run(

)public

void

stop()

public

void

opendoor()

public

void

closedoor()

}}

如上**,假設汽車狀態切換:門關閉狀態->門開啟狀態->啟動狀態->執行狀態->停止狀態,在狀態切換時,有些行為是不能發生的,所以要做限制,下面按照上面車輛狀態切換,來重構以上**:

public

class

state_02

public

void

start()

}public

void

run()}

public

void

stop()

}public

void

opendoor()

}public

void

closedoor()

}private

void

startactive()

private

void

runactive()

private

void

stopactive()

private

void

opendooractive()

private

void

closedooractive()

}public

static

void

main

(string[

] args)

}

以上**的邏輯就是,一開始車門處於關閉狀態,這時候可以執行開啟車門操作,變為開啟狀態,然後執行關閉車門操作,變為關閉車門狀態,在關閉車門狀態下,可以啟動汽車,狀態變為啟動,然後就是行駛,到停止,這就是整個流程。

雖然已經實現功能,但是從以上**可以知道,這部門**每個狀態切換的方法裡面都包含了switch分支,**顯得冗餘,尤其如果有新的狀態加入,每個switch都要新增乙個狀態的判斷分支,改動過大,所以需要對其進行優化。

就是對狀態進行抽象,然後建立子類狀態,每個狀態類裡面都寫入各自狀態對應的邏輯即可,如下:

public

class

state_03

public

abstract

void

start()

;public

abstract

void

run();

public

abstract

void

stop()

;public

abstract

void

open()

;public

abstract

void

close()

;}static

class

context

public

void

setstate

(abstractstate state)

public

void

start()

public

void

run(

)public

void

stop()

public

void

open()

public

void

close()

}//啟動狀態

static

class

startstate

extends

abstractstate

@override

public

void

run(

)@override

public

void

stop()

@override

public

void

open()

@override

public

void

close()

}//行駛狀態

static

class

runstate

extends

abstractstate

@override

public

void

run(

)@override

public

void

stop()

@override

public

void

open()

@override

public

void

close()

}//停止狀態

static

class

stopstate

extends

abstractstate

@override

public

void

run(

)@override

public

void

stop()

@override

public

void

open()

@override

public

void

close()

}//開門狀態

static

class

openstate

extends

abstractstate

@override

public

void

run(

)@override

public

void

stop()

@override

public

void

open()

@override

public

void

close()

}//啟動狀態

static

class

closestate

extends

abstractstate

@override

public

void

run(

)@override

public

void

stop()

@override

public

void

open()

@override

public

void

close()

}public

static

void

main

(string[

] args)

}

以上**主要做了一下動作:

抽象出狀態類,以及抽象方法和依賴的環境類context(具體呼叫類)。

建立乙個環境類context,內部的方法和抽象狀態類一樣,且可以設定當前狀態,在每個方法內部,都是呼叫當前狀態的對應方法。

實現多個具體的狀態類,每個狀態類都有具體執行動作方法,以及實現該狀態下可以切換到哪些狀態方法體,並委託給context來執行。

以上就是狀態模式的乙個簡單的演變過程,官方對狀態模式定義:當乙個物件內建狀態改變時允許其改變行為,這個物件看起來像改變了其類。

狀態模式的優點:

編碼了過多的switch…case或者if…else語句,降低了程式的複雜性,提高了系統可維護性;

遵循設計原則,開閉原則和單一職責原則。

封裝性好

狀態模式的缺點:

狀態太多的情況,就會導致子類過多(類膨脹)

設計模式之狀態模式 行為型

乙個物件在其內部狀態改變時改變其行為,這個物件我們可以稱為狀態物件,所以狀態模式是一種物件行為型模式。上下文類 public class context public void setstate state state public state getstate 抽象狀態類 public abstr...

設計模式 行為型 狀態模式

設計模式行為型 1.觀察者模式 2.模板模式 3.策略模式 4.職責鏈模式 5.狀態模式 6.迭代器模式 7.訪問者模式 8.備忘錄模式 9.命令模式 10.直譯器模式 11.中介模式 對有狀態的物件,把複雜的 判斷邏輯 提取到不同的狀態物件中,允許狀態物件在其內部狀態發生改變時改變其行為。環境類 ...

19 設計模式 行為型 之狀態模式

封裝了轉換規則 列舉可能的狀態,在列舉狀態之前需要確定狀態種類 將所有與某個狀態有關的行為放到乙個類中,並且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為 允許狀態轉換邏輯與狀態物件合成一體,而不是某乙個巨大的條件語句塊 可以讓多個環境物件共享乙個狀態物件,從而減少系統中物件的個數 a...