狀態(tài)模式(State Pattern)
狀態(tài)模式是一種行為設(shè)計(jì)模式,允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為。這種模式通過(guò)把狀態(tài)的變化邏輯分布到State的子類之間,減少了相互間的依賴,使得狀態(tài)的切換更加清晰。
狀態(tài)模式的關(guān)鍵是將那些會(huì)隨著狀態(tài)改變而改變的行為抽離出來(lái),使得狀態(tài)和行為可以獨(dú)立變化,不同狀態(tài)下的行為可以分別管理和修改,增加新的狀態(tài)或者改變狀態(tài)間的轉(zhuǎn)換邏輯變得更加容易。
使用狀態(tài)模式的好處:
- 封裝了轉(zhuǎn)換規(guī)則:狀態(tài)之間的轉(zhuǎn)換操作被封裝在狀態(tài)類中,易于修改和擴(kuò)展。
- 消除了龐大的條件分支語(yǔ)句:狀態(tài)模式通過(guò)多態(tài)性來(lái)消除原本過(guò)多的條件分支語(yǔ)句。
- 將狀態(tài)的邏輯與對(duì)象的其它行為分離:這有助于集中處理對(duì)象在某一狀態(tài)下的行為。
示例:簡(jiǎn)單的工作狀態(tài)切換
假設(shè)我們有一個(gè)工作任務(wù)(Task
)對(duì)象,這個(gè)對(duì)象有幾個(gè)狀態(tài):New
(新創(chuàng)建的任務(wù)),InProgress
(正在進(jìn)行的任務(wù)),Completed
(已完成的任務(wù))。我們可以使用狀態(tài)模式來(lái)設(shè)計(jì)這個(gè)場(chǎng)景。
步驟 1:定義狀態(tài)接口
首先,定義一個(gè)狀態(tài)接口和實(shí)現(xiàn)該接口的具體狀態(tài)類。
interface State {
void proceed(Task task);
}
class New implements State {
public void proceed(Task task) {
System.out.println("Task is starting.");
task.setState(new InProgress());
}
}
class InProgress implements State {
public void proceed(Task task) {
System.out.println("Task is in progress.");
task.setState(new Completed());
}
}
class Completed implements State {
public void proceed(Task task) {
System.out.println("Task is already completed.");
}
}
步驟 2:創(chuàng)建 Context 類
然后,創(chuàng)建包含狀態(tài)的Task
類。
class Task {
private State state;
public Task() {
// 任務(wù)默認(rèn)狀態(tài)為 New
this.state = new New();
}
public void setState(State state) {
this.state = state;
}
public void proceed() {
state.proceed(this);
}
}
步驟 3:使用狀態(tài)模式
最后,演示如何使用狀態(tài)模式來(lái)改變Task
對(duì)象的狀態(tài)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-831741.html
public class StatePatternDemo {
public static void main(String[] args) {
Task task = new Task();
task.proceed(); // Task is starting.
task.proceed(); // Task is in progress.
task.proceed(); // Task is already completed.
}
}
在這個(gè)示例中,Task
對(duì)象的行為隨著其內(nèi)部狀態(tài)的改變而改變,而且狀態(tài)的變更邏輯被封裝在狀態(tài)對(duì)象內(nèi)部。這樣,如果未來(lái)需要添加新的狀態(tài)或者改變狀態(tài)轉(zhuǎn)換的邏輯,我們只需要修改或添加相應(yīng)的狀態(tài)類,而不需要觸及到Task
類的內(nèi)部邏輯,這就是使用狀態(tài)模式的好處。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-831741.html
到了這里,關(guān)于設(shè)計(jì)模式之:狀態(tài)模式(State Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!