行为型(六) - 状态模式

本文详细介绍了状态模式的概念,如何在MediaPlayer状态机中应用,以及其实现方式,包括状态接口、实现类和StateMachine类。通过状态的转换,避免了硬编码if-else判断,实现了状态间的解耦

一、概念

状态模式(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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值