狀態模式,又稱狀態對象模式(Pattern of Objects for States),狀態模式是對象的行爲模式。
狀態模式允許一個對象在其內部狀態改變的時候改變其行爲。這個對象看上去就像是改變了它的類一樣。
1. 環境角色(上下文角色)
/**
* 狀態模式-環境角色
*/
@Slf4j
@Data
public class DeskContext {
private DeskState deskState;
/**
* 環境角色-用戶感興趣的接口方法
*
* @param deskLegNumber 桌腿數量
*/
public void request(Integer deskLegNumber) {
log.info("環境角色-調用狀態類執行:{}", deskLegNumber);
this.deskState.handle(deskLegNumber);
}
}
2. 抽象狀態類
/**
* 狀態模式-抽象狀態類
*/
public interface DeskState {
/**
* 抽象狀態類-狀態對應的處理
*
* @param deskLegNumber 桌腿數量
*/
void handle(Integer deskLegNumber);
}
3. 具體狀態類
/**
* 狀態模式-具體狀態類A
*/
@Slf4j
public class DeskConcreteStateA implements DeskState {
@Override
public void handle(Integer deskLegNumber) {
log.info("具體狀態類A-設置桌腿數量:{}", deskLegNumber);
}
}
/**
* 狀態模式-具體狀態類B
*/
@Slf4j
public class DeskConcreteStateB implements DeskState {
@Override
public void handle(Integer deskLegNumber) {
log.info("具體狀態類B-設置桌腿數量:{}", deskLegNumber);
}
}
4. 測試
/**
* 狀態模式-測試
*/
@Slf4j
public class StateTest {
@Test
public void test() {
DeskContext deskContext = new DeskContext();
DeskState concreteStateA = new DeskConcreteStateA();
deskContext.setDeskState(concreteStateA);
deskContext.request(3);
DeskState concreteStateB = new DeskConcreteStateB();
deskContext.setDeskState(concreteStateB);
deskContext.request(3);
}
}
5. 測試結果:
一點筆記