文章标题

状态模式

状态模式定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况。此时把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

状态模式结构图为:
这里写图片描述

状态模式结构图代码解析:

//抽象状态类
abstract class State{
    public abstract void handle(Context context);
}
//ConcreteState类,指定具体状态,每一个子类实现一个与Context的一个状态相关的行为。
class ConcreteStateA(){ 
    @Override
    public void handle(Context context){
        //设置ConreteStateA 的下一状态为ConreteStateB
        context.setState(new ConcreteStateB());
    }
}
class ConcreteStateB(){
    @Override
    public void handle(Context context){
        //设置ConreteStateB 的下一状态为ConreteStateA
        context.setState(new ConcreteStateA());
    }
}
//Context类,维护一个ConcreteState 子类的实例,这个实例定义当前状态
class Context{

    private State state;
    public Context(State state){
        this.state = state;
    }
    //可以重新设置状态
    public void setState(State state){
        this.state = state;
        print("当前状态:" + state);
    }
    //获取当前状态
    public State getState(){
        return state;
    }

    //处理请求,并设置下一状态
    public void request(){
        //处理请求。。。。
        //不符合条件则进入下一状态。
        state.handle(this);
    }
}
//客户端代码
public class Main{
    public static void main(String[] args){
        //设置Context初始状态为 ConcreteStateA
        Context c = new Context(new ConcreteStateA());

        c.request();
        //Context中的State子类实例已经被改变。
        c.request();
        c.request();
        c.request();
    }
}

      状态模式的好处:将与特定状态相关的行为局部实例化,并且将不同状态的行为分割开来。这样的目的就是消除庞大的条件分支语句。状态模式通过把各种状态转移逻辑分布到各个State子类中,减少相互依赖,这也符合开闭原则和单一职责原则。

      什么时候用状态模式呢?当一个对象的行为取决于他的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式。如果业务需求某项业务有多个状态,通常都是枚举常量,状态的变化都是靠大量分支判断语句来实现,此时可以将每一种业务状态定义为一个State的子类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值