java設計模式學習筆記21-狀態模式

狀態模式,又稱狀態對象模式(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. 測試結果:

一點筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章