博客 / 詳情

返回

狀態模式

狀態模式的定義是允許對象通過改變其狀態的方式改變它的行為。

狀態模式中有以下幾種角色

  • 上下文類:用於記錄狀態、修改狀態,行為的調用等
  • 抽象狀態類:所有用於表示同一類狀態的類的父類,並定義了一個行為接口
  • 具體狀態類:不同狀態的具體實現

下面是使用狀態模式對一個打印機行為的一種實現。

上下文類

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();
    }
}
=====結果=====
打印機正在被佔用....
打印結束,轉為空閒模式

狀態模式和策略模式很像,用下面的兩個時序圖很容易看出兩者的一些差異。
原文鏈接

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.