個人部落格,想要搭建個人部落格的可以進來看看:
狀態模式 , 允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類
設計模式系列原始碼:
背景 , 水有三種狀態,通過不同方法可以在三種狀態中進行轉變;我們這裡要做的就是實現這個轉變的過程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.定義狀態...