四、與策略模式的區別
學而不思則罔,思而不學則殆。 ——孔子狀態模式是設計模式中行為型模式的一種。乙個物件在它的狀態改變時,它的行為也隨之改變,看起來好像改變了其類。
假如**有三種狀態:通話中、待機中、已關機。四種行為:打**、掛**、開機、關機。那麼在不同的狀態下這四種行為的表現方式肯定不同。例如關機狀態下不能打**,而待機狀態下就可以打**。
/**
* 不使用狀態模式的實現方式
* * @author zhengnc
* @date 2020/9/22 16:48
*/public
class
notusedstatepattern
private state state = state.shutdown;
/** * 打**
*/public
void
call()
}/**
* 掛**
*/public
void
bye()}
/** * 關機
*/public
void
shutdown()
}/**
* 開機
*/public
void
bootup()
}}
從以上**中可以發現,類中的邏輯過於複雜,而且如果要增加一種狀態的話將需要修改每個行為對應的方法。
phoneaction(**動作):
/**
* **動作
* * @author zhengnc
* @date 2020/9/22 15:36
*/public
inte***ce
phoneaction
phonestate(手機狀態):
/**
* 手機狀態
* * @author zhengnc
* @date 2020/9/22 15:20
*/public
abstract
class
phonestate
implements
phoneaction
@override
public string tostring()
}
calling(狀態:通話中):
/**
* 狀態:通話中
* * @author zhengnc
* @date 2020/9/22 15:54
*/public
class
calling
extends
phonestate
@override
public
void
call()
@override
public
void
bye(
)@override
public
void
shutdown()
@override
public
void
bootup()
}
shutdown(狀態:已關機):
/**
* 狀態:已關機
* * @author zhengnc
* @date 2020/9/22 16:13
*/public
class
shutdown
extends
phonestate
@override
public
void
call()
@override
public
void
bye(
)@override
public
void
shutdown()
@override
public
void
bootup()
}
standby(狀態:待機中):
/**
* 狀態:待機中
* * @author zhengnc
* @date 2020/9/22 16:00
*/public
class
standby
extends
phonestate
@override
public
void
call()
@override
public
void
bye(
)@override
public
void
shutdown()
@override
public
void
bootup()
}
phone(**):
/**
* **
* * @author zhengnc
* @date 2020/9/22 15:24
*/public
class
phone
implements
phoneaction
public phonestate getstandby()
public phonestate getshutdown()
public phonestate getstate()
public
void
setstate
(phonestate state)
@override
public
void
call()
@override
public
void
bye(
)@override
public
void
shutdown()
@override
public
void
bootup()
}
/**
* 測試狀態模式
* * @author zhengnc
* @date 2020/9/22 16:31
*/public
class
teststate
}
輸出結果:
狀態:已關機剛接觸狀態模式的時候肯定覺得和策略模式很像,但它們最大的區別就是策略模式的策略是手動選擇的,而狀態模式的狀態卻是物件自動變化的。手機已關機,無法通話!
狀態:已關機
手機已關機,不需結束通話!
狀態:已關機
狀態:待機中
狀態:通話中
狀態:待機中
狀態:已關機
設計模式學習筆記 狀態模式
定義 當乙個物件內在的狀態改變時,允許其改變行為,這個物件看起來像是改變了其類。狀態模式不太好理解,我現在還沒有完全理解,這個模式給我的第一印象就是比較亂,給我的感覺好像是兩個類互相依賴,呼叫 的方法,呼叫 的方法,弄的好亂,所以這個狀態模式就不用通用類圖去描述了,那樣會不知所云,還是舉乙個實際的例...
設計模式學習筆記 狀態模式
模式中的角色 state 抽象狀態角色 concretestate 具體狀態角色 context 環境角色 狀態模式通用類圖如下 具體的類圖如下 實現如下 package state2 context類,維護乙個concretestate子類的例項,這個例項定義當前的狀態。public class ...
設計模式學習筆記 狀態模式
1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...