行为型(六) - 状态模式

一、概念

状态模式(State Pattern):类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

使用场景: 一个对象的行为由它的状态决定,而且它必须在运行时根据自身状态改变它的行为。

二、实现

这里控件MediaPlayer状态机转换做例子,状态装换如下图:
mediaplayer.PNG
1、 状态机接口

public interface State {
    
    
    String getName();
    void start(StateMachine stateMachine);
    void pause(StateMachine stateMachine);
    void stop(StateMachine stateMachine);
    void prepare(StateMachine stateMachine);
}

2、状态实现类,这里代码只贴了两个状态,其他都类似。

#PausedState 
public class PausedState implements State {
    
    
    private static final PausedState instance = new PausedState();
    public static State getInstance() {
    
    
        return instance;
    }

    @Override
    public void start(StateMachine stateMachine) {
    
    
        System.out.println("进入start前的准备工作");
        stateMachine.setState(StartedState.getInstance());
    }

    @Override
    public void pause(StateMachine stateMachine) {
    
    
    }

    @Override
    public void stop(StateMachine stateMachine) {
    
    
        System.out.println("进入stop前的准备工作");
        stateMachine.setState(StoppedState.getInstance());
    }

    @Override
    public void prepare(StateMachine stateMachine) {
    
    
    }

    @Override
    public String getName() {
    
    
        return "paused";
    }
}

#StartedState
public class StartedState implements State {
    
    
    private static final StartedState instance = new StartedState();
    public static State getInstance() {
    
    
        return instance;
    }

    @Override
    public void start(StateMachine stateMachine) {
    
            
    }

    @Override
    public void pause(StateMachine stateMachine) {
    
    
        System.out.println("进入pause前的准备工作");
        stateMachine.setState(PausedState.getInstance());
    }

    @Override
    public void stop(StateMachine stateMachine) {
    
    
        System.out.println("进入stop前的准备工作");
        stateMachine.setState(StoppedState.getInstance());
    }

    @Override
    public void prepare(StateMachine stateMachine) {
    
    
    }

    @Override
    public String getName() {
    
    
        return "started";
    }
}

3、状态机

public class StateMachine {
    
    
    private State state = PreparedState.getInstance();

    public State getState() {
    
    
        return state;
    }

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

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

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

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

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

4、测试类

public class Client {
    
    
    public static void main(String[] args) {
    
    
        StateMachine stateMachine = new StateMachine();
        System.out.println("现在的状态:" + stateMachine.getState().getName());

        stateMachine.start();
        System.out.println("现在的状态:" + stateMachine.getState().getName());

        stateMachine.pause();
        System.out.println("现在的状态:" + stateMachine.getState().getName());
    }
}

5、运行结果
状态模式结果.png

总结:个人理解,使用场景就是包含有多种状态,且状态间可通过一些操作进行转换。正常硬代码实现,就是if-else判断当前状态,切换为下一个状态。为了避免过多状态及操作代码耦合,将各个状态都单独拆出来,在状态类中加入状态流转逻辑,把执行操作抽离到StateMachine中实现解耦。

参考文章:
状态模式(state pattern)

猜你喜欢

转载自blog.csdn.net/kongqwesd12/article/details/132403535