Java设计模式(十八)--状态模式

66 阅读1分钟

简介

状态模式能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。

抽象状态角色

public interface State {

    public void open(Context context);

    public void action(Context context);

    public void close(Context context);

}

定义状态角色在特定状态下的相关行为。

具体状态角色

public class OpenState implements State {

    @Override
    public void open(Context context) {
        System.out.println("open状态下不能重复执行open操作");
    }

    @Override
    public void action(Context context) {
        context.setState(new ActionState());
        System.out.println("执行action操作");
    }

    @Override
    public void close(Context context) {
        context.setState(new CloseState());
        System.out.println("执行close操作");
    }

}

public class ActionState implements State {

    @Override
    public void open(Context context) {
        System.out.println("action状态下不能执行open操作");
    }

    @Override
    public void action(Context context) {
        System.out.println("action状态下不能重复执行action操作");
    }

    @Override
    public void close(Context context) {
        context.setState(new CloseState());
        System.out.println("执行close操作");
    }

}

public class CloseState implements State {

    @Override
    public void open(Context context) {
        context.setState(new OpenState());
        System.out.println("执行open操作");
    }

    @Override
    public void action(Context context) {
        System.out.println("close状态不能执行action操作");
    }

    @Override
    public void close(Context context) {
        System.out.println("close状态不能重复执行close操作");
    }

}

每一个具体的状态角色类对应一个具体的状态,不同的状态角色类中的行为也不相同。

环境角色

public class Context {

    private State state = null;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public Context(){
        // 默认close状态
        state = new CloseState();
    }

    public void open(){
        state.open(this);
    }

    public void action(){
        state.action(this);
    }

    public void close(){
        state.close(this);
    }
}

使用环境角色类来封装状态角色,并通过该类来调用不同状态下的各个行为方法。

测试

public class StateDemo {

    @Test
    public void stateTest(){
        Context context = new Context();

        context.open();
        context.action();
        context.close();
    }

}

总结

状态模式很好的解决了if else之类的代码,但是当状态的数量增加时,也会导致具体状态角色的类的数量随之增加。