狀態模式的定義是允許對象通過改變其狀態的方式改變它的行為。
狀態模式中有以下幾種角色
- 上下文類:用於記錄狀態、修改狀態,行為的調用等
- 抽象狀態類:所有用於表示同一類狀態的類的父類,並定義了一個行為接口
- 具體狀態類:不同狀態的具體實現
下面是使用狀態模式對一個打印機行為的一種實現。
上下文類
public class PrinterContext {
private PrinterState state;
public PrinterContext(PrinterState state) {
this.state = state;
}
public PrinterState getState() {
return state;
}
public void setState(PrinterState state) {
this.state = state;
}
public void handle(){
state.handle(this);
}
}
抽象狀態類
public interface PrinterState {
void handle(PrinterContext context);
}
具體狀態類
public class OccupyState implements PrinterState {
@Override
public void handle(PrinterContext context) {
System.out.println("打印機正在被佔用....");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.out.println("打印結束,轉為空閒模式");
context.setState(new IdleState());
}
}
}
public class IdleState implements PrinterState {
@Override
public void handle(PrinterContext context) {
System.out.println("打印機空閒中.....");
}
}
測試類
public class StateTest {
@Test
public void test(){
PrinterState occupyState = new OccupyState();
PrinterContext context = new PrinterContext(occupyState);
context.handle();
}
}
=====結果=====
打印機正在被佔用....
打印結束,轉為空閒模式
狀態模式和策略模式很像,用下面的兩個時序圖很容易看出兩者的一些差異。
原文鏈接