定義:
- 狀態(tài)模式也稱為狀態(tài)機(jī)模式,允許對象在內(nèi)部狀態(tài)發(fā)生改變時改變它的行為,對象看起來好像修改了它的類。
- 屬于行為型模式。
狀態(tài)模式的角色組成:
- State(抽象狀態(tài)類):定義一個接口用來封裝與環(huán)境類的一個特定狀態(tài)相關(guān)的行為,可以有一個或多個行為。
- ConcreteState(具體狀態(tài)類):作為抽象狀態(tài)類的子類,每個子類實現(xiàn)一個與環(huán)境類的一個狀態(tài)相關(guān)的行為。每個具體狀態(tài)類對應(yīng)環(huán)境類的一個具體狀態(tài),不同的具體狀態(tài)類其行為有所不同。
- Context(環(huán)境類):環(huán)境類中維護(hù)一個具體狀態(tài)的實例,通常有多種狀態(tài),負(fù)責(zé)具體狀態(tài)的切換。
狀態(tài)模式的 UML 類圖:
??情景案例:CSDN 博客平臺的內(nèi)容管理模塊對文章進(jìn)行了統(tǒng)一管理,目前文章的狀態(tài)分為“
全部
”、“全部可見
”、“僅我可見
”、“審核
”、“草稿箱
”和“回收站
”這六種狀態(tài)。不同狀態(tài)文章的“行為”是不同的,例如,“全部
”表示可以看到其他五種狀態(tài)文章的合集,“全部可見
”表示可以看到全部已經(jīng)發(fā)表的設(shè)置設(shè)為公開的文章,“僅我可見
”表示只能看到已經(jīng)發(fā)布的私密文章,使用狀態(tài)模式對該情景進(jìn)行模擬編碼。
抽象狀態(tài)類 State
:
public interface State {
void handle();
}
具體狀態(tài)類 All
:
public class All implements State{
@Override
public void handle() {
System.out.println("所有文章,包括所有公開文章、私密文章、審核文章、草稿文章、已經(jīng)被刪除的文章");
}
}
具體狀態(tài)類 AllVisible
:
public class AllVisible implements State{
@Override
public void handle() {
System.out.println("所有公開文章");
}
}
具體狀態(tài)類 Private
:
public class Private implements State{
@Override
public void handle() {
System.out.println("所有私密文章");
}
}
具體狀態(tài)類 Audit
:
public class Audit implements State{
@Override
public void handle() {
System.out.println("所有審核文章");
}
}
具體狀態(tài)類 Manuscript
:
public class Manuscript implements State {
@Override
public void handle() {
System.out.println("所有草稿文章");
}
}
具體狀態(tài)類 Recycled
:
public class Recycled implements State{
@Override
public void handle() {
System.out.println("所有已經(jīng)被刪除的文章");
}
}
環(huán)境類 Context
:
public class Context {
private State state;
public void setState(State state) {
this.state = state;
}
void request() {
this.state.handle();
}
}
客戶端類 Client
:
public class Client {
public static void main(String[] args) {
Context context = new Context();
context.setState(new All());
context.request();
context.setState(new AllVisible());
context.request();
context.setState(new Private());
context.request();
}
}
狀態(tài)模式的優(yōu)點:
-
消除龐大的條件分支語句:將特定的狀態(tài)獨立為類,消除了冗余的
if...else
或switch...case
語句,使代碼更加簡潔,提高了系統(tǒng)的可維護(hù)性。 - 狀態(tài)轉(zhuǎn)換顯式化:將特定的狀態(tài)相關(guān)的行為都放入一個對象中,由于所有與狀態(tài)相關(guān)的代碼都存在于某個ConcreteState中,所以通過定義新的子類可以很容易地增加新的狀態(tài)和轉(zhuǎn)換。
狀態(tài)模式的缺點:
- 類膨脹問題:如果一個事物具備很多狀態(tài),則會造成狀態(tài)類太多。
狀態(tài)模式的適用場景:
- 一個操作中含有龐大的多分支結(jié)構(gòu),并且這些分支取決于對象的狀態(tài)。
- 對象的行為依賴于它的狀態(tài)(例如某些屬性值),狀態(tài)的改變將導(dǎo)致行為的變化。
??狀態(tài)模式在 JDK 或 Spring 源碼中的應(yīng)用:文章來源:http://www.zghlxwxcb.cn/news/detail-451879.html
很遺憾哈哈,目前無論是在 JDK 還是在 Spring 源碼中,具體實現(xiàn)了狀態(tài)模式的類和接口并不常見(也就是沒有哈哈),因為狀態(tài)模式并非是JDK 或 Spring 框架中廣泛采用的設(shè)計模式之一。雖然可能沒有明確稱之為"狀態(tài)模式",但是可以找到一些與狀態(tài)模式相似的設(shè)計。例如:文章來源地址http://www.zghlxwxcb.cn/news/detail-451879.html
-
ThreadPoolExecutor
類是 Java 并發(fā)庫中用于執(zhí)行多個線程任務(wù)的線程池實現(xiàn)之一。它內(nèi)部維護(hù)了線程池的狀態(tài),如 RUNNING、SHUTDOWN、STOP、TIDYING 和 TERMINATED 等。根據(jù)不同的狀態(tài),ThreadPoolExecutor
會在處理任務(wù)、關(guān)閉線程池等過程中執(zhí)行不同的行為,從而實現(xiàn)了一種狀態(tài)切換的邏輯。 - 該示例只是在某種程度上與狀態(tài)模式相似,而不是典型的狀態(tài)模式應(yīng)用。
到了這里,關(guān)于《設(shè)計模式》狀態(tài)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!