狀態設計模式是一種行為設計模式之一。當對象根據其內部狀態改變其行為時,可以使用狀態設計模式。
狀態設計模式
如果我們需要根據對象的狀態來改變其行為,可以在對象中添加一個狀態變量,然後使用if-else條件塊根據狀態執行不同的操作。狀態設計模式通過
Context
和State
的實現提供了一種系統化和鬆散耦合的方法來實現這一需求。狀態模式Context是一個具有對State具體實現的引用的類。Context將請求轉發給狀態對象進行處理。讓我們通過一個簡單的例子來理解這個概念。假設我們想要實現一個帶有單一按鈕執行操作的電視遙控器。如果狀態為ON,它將打開電視,如果狀態為OFF,它將關閉電視。我們可以使用如下的if-else條件來實現;TVRemoteBasic.java
package com.journaldev.design.state;
public class TVRemoteBasic {
private String state="";
public void setState(String state){
this.state=state;
}
public void doAction(){
if(state.equalsIgnoreCase("ON")){
System.out.println("TV is turned ON");
}else if(state.equalsIgnoreCase("OFF")){
System.out.println("TV is turned OFF");
}
}
public static void main(String args[]){
TVRemoteBasic remote = new TVRemoteBasic();
remote.setState("ON");
remote.doAction();
remote.setState("OFF");
remote.doAction();
}
}
注意到客戶端代碼應該知道用於設置遠程狀態的具體值。此外,如果狀態數量增加,則實現和客戶端代碼之間的緊密耦合將非常難以維護和擴展。現在,我們將使用狀態模式來實現上面的電視遙控器示例。
狀態設計模式介面
首先,我們將創建狀態介面,該介面將定義應由不同具體狀態和上下文類實現的方法。State.java
package com.journaldev.design.state;
public interface State {
public void doAction();
}
狀態設計模式具體狀態實現
在我們的示例中,我們可以有兩個狀態 – 一個用於打開電視,另一個用於關閉電視。因此,我們將為這些行為創建兩個具體狀態實現。TVStartState.java
package com.journaldev.design.state;
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
TVStopState.java
package com.journaldev.design.state;
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
現在我們準備實現我們的上下文對象,該對象將根據其內部狀態更改其行為。
狀態設計模式上下文實現
TVContext.java
package com.journaldev.design.state;
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState=state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
請注意,上下文也實現了狀態並保留了對其當前狀態的引用,並將請求轉發到狀態實現。
狀態設計模式測試程序
現在讓我們編寫一個簡單的程序來測試我們對電視遙控器的狀態模式實現。TVRemote.java
package com.journaldev.design.state;
public class TVRemote {
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
}
上述程序的輸出與未使用狀態模式的電視遙控器的基本實現相同。
狀態設計模式的好處
使用State模式实现多态行为的好处显而易见。错误的几率较小,而且很容易为额外的行为添加更多的状态。因此,使我们的代码更健壮、易于维护和灵活。此外,State模式有助于避免在这种情况下使用if-else或switch-case条件逻辑。State模式与Strategy模式非常相似,请查看Java中的Strategy模式。关于Java中的State设计模式就介绍到这里,希望你喜欢。
Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java