JAVA 状态模式

文章目录

介绍

状态模式

实现

介绍

描述

状态模式设计模式属于行为型模式,对于控制一个对象状态转换的条件表达式过于复杂时,将其特定的状态相关的行为都放入一个对象中,通过定义新的状态类去改变当前上下文状态从而改变它的相关行为。
特点

  1.  优点:取代大量的if-else操作,多个环境对象共享一个状态对象,减少相互间的依赖。

  2.  缺点:增加系统类和对象的个数,导致系统维护难度增加。

实现原理

将同一个状态对象传入,在不同的状态中,改变实例变量的值。

Context(上下文类):在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。

State(抽象状态类):作为接口以封装与Context类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现这些方法,从而不同状态下对象的行为也不同。

ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与Context类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。
适用

  1. 当一个事件或者对象有很多种状态,并且之间相互转换,对不同的状态要求不同的行为的场景。

  2. 条件、分支语句的代替者。

状态模式

实现

模拟游戏开始结束的不同状态切换。

第一步:创建游戏环境。

public class Context {

    private State state;

    public Context() {
        state = null;
    }

    public State getState() {
        return state;
    }

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

第二步:创建状态接口State。

public interface State {
    public void doAction(Context context);
}

第三步:实现不同状态接口StartState、EndState。

// 开始状态
public class StartState implements State{
    @Override
    public void doAction(Context context) {
        System.out.println("游戏 开始状态 ....");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "State => StartState";
    }
}
// 结束状态
public class EndState implements State{
    @Override
    public void doAction(Context context) {
        System.out.println("游戏 结束状态 ....");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "State => EndState";
    }
}

第四步:测试。

public class Test {
    public static void main(String[] args) {
        // 当前游戏环境创建
        Context context = new Context();
        StartState startState = new StartState();
        // 设置
        startState.doAction(context);
        System.out.println(context.getState());
        EndState endState= new EndState();
        endState.doAction(context);
        System.out.println(context.getState());
        /*
        游戏 开始状态 ....
        State => StartState
        游戏 结束状态 ....
        State => EndState
        */
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值