設計模式 10 狀態模式(事務的狀態)

2021-08-19 02:53:43 字數 3611 閱讀 4171

要點**例項

將每個狀態的行為區域性化到它自己的類中

將容易產生問題的if語句刪除,以方便日後的維護。

讓每乙個狀態」對修改關閉」、讓糖果機」堆擴充套件開放」,因為可以加入新的狀態類

建立乙個新的**基和類結構,這更能對映萬

能糖果公司的圖,而且更容易閱讀和理解

允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。

解釋:

物件看起來好像修改了它的類

狀態轉換放在context還是狀態類中

當狀態轉換時固定的時候,就適合放context中;當裝換時更動態的時候,通常就會放在狀態類中

在做這個決策的同時,也等於是在為另一件事情做決策:在系統進化是,究竟哪個類是對修改封閉的(context還是狀態類)。

客戶不允許和狀態互動

如果想共享狀態:

需要把每個狀態都指定到靜態的例項變數中。如果你的狀態需要利用到context中的方法或者例項變數,你還必須在每個handler()方法內傳入乙個context的引用。

使用狀態模式的類會很多

狀態模式的state選擇抽象類還是介面?

使用介面:如果沒有共同的功能可以放進象類中。

使用抽象類:以後需要在抽象類加入新的方法時就很容易,不需要打破具體狀態的實現。

public

class gumballmachine

public state soldoutstate

public state noquarterstate

public state hasquarterstate

public state soldstate

public

int count

public state winnerstate

public

gumballmachine(int count)

}//放入25美分

public

void

insertquarter()

//退款

public

void

ejectquarter()

//轉動搖桿獲取糖果

public

void

turncrank()

public

void

releaseball()}}

public

inte***ce state

只寫2個,別的省略

public

class hasquarterstate : state

public

void

dispense()

public

void

ejectquarter()

public

void

insertquarter()

public

void

turncrank()

else}}

public

class winnerstate : state

public

void

dispense()

else

else }}

public

void

ejectquarter()

public

void

insertquarter()

public

void

turncrank()

}

gumballmachine gumballmachine = new gumballmachine(5);

console.writeline(gumballmachine);

gumballmachine.insertquarter();

gumballmachine.turncrank();

console.writeline(gumballmachine);

gumballmachine.insertquarter();

gumballmachine.ejectquarter();

gumballmachine.turncrank();

console.writeline(gumballmachine);

gumballmachine.insertquarter();

gumballmachine.turncrank();

gumballmachine.insertquarter();

gumballmachine.turncrank();

gumballmachine.ejectquarter();

console.writeline(gumballmachine);

gumballmachine.insertquarter();

gumballmachine.insertquarter();

gumballmachine.turncrank();

gumballmachine.insertquarter();

gumballmachine.turncrank();

gumballmachine.insertquarter();

gumballmachine.turncrank();

console.writeline(gumballmachine);

patterndemos.statepatterndemo

.gumballmachine

你付款了,機器正在改變狀態

正在出糖果

正在出糖果

patterndemos.statepatterndemo

.gumballmachine

你付款了,機器正在改變狀態

退錢完畢

你沒付錢,不可能給你糖果

你需要付錢

patterndemos.statepatterndemo

.gumballmachine

你付款了,機器正在改變狀態

正在出糖果

正在出糖果

你付款了,機器正在改變狀態

正在出糖果

你是贏家,你使用25美分拿出了2個糖果

你沒付錢,不能退款

patterndemos.statepatterndemo

.gumballmachine

你付款了,機器正在改變狀態

不能再繼續放入錢

正在出糖果

正在出糖果

你付款了,機器正在改變狀態

正在出糖果

正在出糖果

你付款了,機器正在改變狀態

正在出糖果

正在出糖果

patterndemos.statepatterndemo

.gumballmachine

設計模式(10)狀態模式(講解 應用)

目錄 狀態模式 為什麼使用狀態模式?應用例項 狀態模式,顧名思義,肯定是和狀態有關,進一步思考,我們在討論的是設計模式,設計模式中的重要原則對變化的進行封裝,順著這個思路去想,那麼是有很多的變化的狀態,然後通過狀態設計模式,來對這些變化的狀態進行封裝,故狀態設計模式。狀態模式 對於物件內部的狀態,允...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...