設計模式 狀態模式

2021-08-08 09:28:35 字數 3459 閱讀 3271

個人部落格,想要搭建個人部落格的可以進來看看:

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

設計模式系列原始碼:

背景 , 水有三種狀態,通過不同方法可以在三種狀態中進行轉變;我們這裡要做的就是實現這個轉變的過程

1.簡單的實現,不是用狀態模式

public

class

initialdemo else

if(state == gas)else

if(state == liquid)

}//液化過程,只有氣態執行,其他態都報error

public

void

liquidation()else

if(state == liquid)else

if(state == solid)

}//凝固過程,只有液臺可執行,其他態都報error

public

void

sloiding()else

if (state == solid)else

if(state == gas)

}//返回當前狀態

@override

public string tostring()

//測試

public

static

void

main(string args)

}

我們把所有的**寫到一塊,在每個方法中通過判斷當前狀態是否是方法要求的,需要很多的判斷語句,萬一科學家發現水還有好多種混合態,哪所有的方法都要改變,我們要利用狀態模式了

2.狀態模式uml

state介面

/**state介面,所有的狀態(固液氣)都要繼承他*/

public

inte***ce

state

context上下午

/**context上下文*/

public

class

watercontext

public

void

setcurrentstate(state currentstate)

public state getcurrentstate()

//下面上getter()用於在狀態具體實現類中改變狀態時得到狀態

public state getgasstate()

public state getliquidstate()

public state getsoldstate()

}

concretestatea

/**注意,每種狀態不僅僅要繼承state介面,還要持有乙個上下午context的引用*/

public

class

ga******ments

state

//錯誤操作

@override

public

void

warm()

//正確的操作

@override

public

void

liquidation()

//錯誤的操作

@override

public

void

sloiding()

}/**注意,每種狀態不僅僅要繼承state介面,還要持有乙個上下午context的引用*/

public

class

liquid

implements

state

//下面2個方法都是錯誤的操作

@override

public

void

warm()

@override

public

void

liquidation()

//正確的操作,所有設定轉變後的狀態,列印ok

@override

public

void

sloiding()

}public

class

solid

implements

state

@override

public

void

warm()

@override

public

void

liquidation()

@override

public

void

sloiding()

}

測試main

public

class

main

}//結果:

ok : sloding , liquid become solid

ok : warming , solid become gas

ok : liquindation , gas become liquid

process finished with exit code 0

//錯誤的測試一下

watercontext watercontext = new watercontext();

//liquid無法執行warm,狀態還是液體

watercontext.getcurrentstate().warm();

//liquid -> sold

watercontext.getcurrentstate().sloiding();

// 當前是sold,無法執行liquidation()操作

watercontext.getcurrentstate().liquidation();

//錯誤測試結果和上面注釋的一樣

error : you need to become liquid to solid , them warm...

ok : sloding , liquid become solid

error : you need to become solid to gas ,them liquidation

process finished with exit code 0

看了**後,結合uml類圖,對狀態模式更加清晰了,我們這裡總結一下,在狀態模式中,將一群行為封裝在狀態物件中,context的新聞隨時可委託到它內部的任何乙個狀態物件,隨著時間的改變,contex中的當前狀態在一直改變,但是context的客戶卻不知道,只需要呼叫contex當前狀態的方法就可以

設計模式 狀態模式

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

設計模式 狀態模式

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

設計模式 狀態模式

描述 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類。主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。通常應用在有好多狀態的流程中。類圖 以下程式模擬糖果機器投幣取糖果的狀態流程。1.定義狀態...