设计模式-第十章-状态模式

99 阅读2分钟

设计模式 第十章 状态模式

状态模式

public interface State {
    public void start(Context context);
    public void close(Context context);
}



public class CloseState implements State{
    @Override
    public void start(Context context) {
        context.setState(new StartState());
        System.out.println("start State");
    }

    @Override
    public void close(Context context) {

    }
}


public class StartState implements State {
    @Override
    public void start(Context context) {

    }

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


public class Context {
    private State state;

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


    public State getState(){
        return state;
    }

    public void start(){
        getState().start(this);
    }

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


public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();

        StartState startState = new StartState();
        context.setState(startState);

        context.close();
        context.start();
    }
}


/*
状态模式跟策略模式不同的是状态切换并不需要主控来指定是哪一种,而是在各个状态类里就指明了状态切换的各种关系

如上例,对于一台电脑开、关机有两种状态(实际是三种,还有一种未开机,先略过)

当电脑开机时start()什么都不用做,这时能调用关机。

当电脑关机时,电脑关机close()什么都不能做,只能调用start()。

如果按照传统的方法来做的,start()和close()状态切换和判断都是由if,else来处理。

那会导致整个代码会有多段if else的逻辑判断,所以选择的是把这种if else的耦合关系,封装到每个状态类里。

由于状态是由状态类控制,所以状态类里必须包含状态各种逻辑关系,比如StartState类的start方法为空,close置为CloseState类
CloseState类的close方法为空,start方法置为StartState类


Context是具体环境,也就是状态切换需要用context来跟进状态转换,所以state需要传进去context,用来跟进状态变换

而不是由context主动决定变动(策略模式),而是context传入状态,由状态类把状态转移传递给context

所以需要start(Context context)

context.setState()
context.getState()

状态类接受context,状态转移由context来跟进

context如何跟进,setState(状态类)和getState()

 */