设计模式 之 状态模式

设计模式 之 状态模式

概念

类的行为基于它的状态而改变

主体思想是将各种具体的状态类抽象出来。也就是会有很多状态类。

使用场景
  • 代码中包含大量与对象状态有关的条件语句
  • 行为随状态的改变而改变
特点
  • 各个状态之间可以互相转换,比如工作流。
  • 各个状态可以独立完成各自任务。

代码

代码场景

模仿工作流,目前有三个状态,分别为 AState、BState、CState,且状态的流转过程为 AState -> BState -> CState

具体代码

状态抽象类 AbstractState

/**
 * 状态抽象类
 * @author GaoYuan
 * @date 2018/11/11 上午8:42
 */
public abstract class AbstractState {

    /** 封装了上下文 */
    protected Context context;

    public void setContext(Context  context){
        this.context = context;
    }

    /** 执行方法 */
    abstract void run();

    /** 切换至下一个状态 */
    abstract void next();
}

具体状态类

public class AState extends AbstractState {

    /** 执行方法 */
    @Override
    public void run() {
        System.out.println("执行 AState 的 run() 方法");
    }

    /** 切换至下一个状态 */
    @Override
    void next() {
        System.out.println("执行 AState 的 next() 方法");
        // 定义了下一个状态是 BState
        context.setState(new BState());
    }
}
public class BState extends AbstractState {

    /** 执行方法 */
    @Override
    public void run() {
        System.out.println("执行 BState 的 run() 方法");
    }

    /** 切换至下一个状态 */
    @Override
    void next() {
        System.out.println("执行 BState 的 next() 方法");
        // 定义了下一个状态是 CState
        context.setState(new CState());
    }
}
public class CState extends AbstractState {

    /** 执行方法 */
    @Override
    public void run() {
        System.out.println("执行 CState 的 run() 方法");
    }

    /** 切换至下一个状态 */
    @Override
    void next() {
        System.out.println("执行 CState 的 next() 方法");
        System.out.println("已经是最后一个状态了!");
    }
}

Context

/**
 * 上下文
 * @author GaoYuan
 * @date 2018/11/11 上午8:16
 */
public class Context {

    private AbstractState state;

    public AbstractState getState() {
        return state;
    }
    /** 设置当前状态 */
    public void setState(AbstractState state) {
        this.state = state;
        // 记得 setContext,不然会空指针
        this.state.setContext(this);
    }
    /** 执行方法 */
    public void run(){
        this.state.run();
    }
    /** 下一个状态 */
    public void next(){
        this.state.next();
    }
}

测试类

/**
 * 约定 状态的流转过程为 AState -> BState -> CState
 * @author GaoYuan
 * @date 2018/11/11 上午8:45
 */
public class TestMe {

    public static void main(String[] args){
        Context context = new Context();
        context.setState(new AState());

        context.run();
        System.out.println("当前状态:" + context.getState().toString());
        context.next();
        System.out.println("当前状态:" + context.getState().toString());

        context.run();
        System.out.println("当前状态:" + context.getState().toString());
        context.next();
        System.out.println("当前状态:" + context.getState().toString());

        context.run();
        System.out.println("当前状态:" + context.getState().toString());
        context.next();
        System.out.println("当前状态:" + context.getState().toString());

    }
}

输出

执行 AState 的 run() 方法
当前状态:com.foruo.learn.designmode.state.AState@2503dbd3
执行 AState 的 next() 方法
当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d
执行 BState 的 run() 方法
当前状态:com.foruo.learn.designmode.state.BState@4b67cf4d
执行 BState 的 next() 方法
当前状态:com.foruo.learn.designmode.state.CState@7ea987ac
执行 CState 的 run() 方法
当前状态:com.foruo.learn.designmode.state.CState@7ea987ac
执行 CState 的 next() 方法
已经是最后一个状态了!
当前状态:com.foruo.learn.designmode.state.CState@7ea987ac

码云

https://gitee.com/gmarshal/foruo-learn-java/tree/master/src/main/java/com/foruo/learn/designmode/state

博客

https://my.oschina.net/gmarshal/blog/2875911

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

转载于:https://my.oschina.net/gmarshal/blog/2875911

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值