java状态机设计模式_设计模式总结-State模式

本文介绍了Java状态机设计模式的适用场合、与Command模式的比较,并通过具体的例子阐述其构成和特点。状态模式封装了状态转换规则,适用于状态切换频繁的场景,可与Observer模式结合使用。
摘要由CSDN通过智能技术生成

不同的状态,不同的行为;或者说,每个状态有着相应的行为.

二、State模式的适用场合:

State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了.

三、State模式与Command模式的比较:

前者从调用者和被调用者的角度出发,目的是封装被调用者的行为,让调用者只和统一的顶层接口打交道。后者从对象自身的状态出发,不涉及调用者和被调用者。是对象自身的状态切换导致的行为变化。

四、“开关切换状态” 和“ 一般的状态判断”区别:

“开关状态切换”经常发生在GUI界面的交互过程中,通过结合对象当前状态和参数,判断接下来对象应该切换到什么状态。被判断对象和被更新对象都是同一个。这一点和“一般的状态判断”是不同的,后者是根据其它对象或属性的值来更新自身的状态。被判断对象和被更新对象不是同一个。

例如:if (which==1) state="hello";

else if (which==2) state="hi";

else if (which==3) state="bye";

这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成:

if (state.euqals("bye")) state="hello";

else if (state.euqals("hello")) state="hi";

else if (state.euqals("hi")) state="bye";

这就是 "开关切换状态",是将state的状态从"hello"切换到"hi",再切换到""bye";再切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了.

五、State模式的构成:

1.state manager 状态管理器,就是开关,如上面例子的Context实际就是一个state manager, 在state manager中有对状态的切换动作.

2.用抽象类或接口实现的父类,,不同状态就是继承这个父类的不同子类(也就是不同的状态行为)

六、State模式的例子:状态机--父类定义

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicabstractclassState9b8a8a44dd1c74ae49c20a7cd451974e.png{//状态行为的父类

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png//状态机需要能够感知上下文的情况,也就是之前的状态和目前的情形,所以用Context作为参数d18c02628675d0a2c816449d98bda930.pngpublic abstract void handlepush(Context c);

d18c02628675d0a2c816449d98bda930.png  public abstract void handlepull(Context c);d18c02628675d0a2c816449d98bda930.pngpublicabstractvo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java状态机设计模式是一种用于实现状态机的软件设计模式状态机是一种抽象的模型,它描述了一个对象或者系统在不同的状态之间的转换。状态机通常包含状态、转移和事件。在Java中,可以使用状态机设计模式来实现各种不同的状态机,如有限状态自动机(FSM)和层次状态机(HSM)等。 在Java中,状态机设计模式通常使用状态模式和策略模式实现。状态模式用于描述状态转换的过程,而策略模式用于确定状态机的行为。在状态模式中,每个状态都是一个对象,而状态转换则是通过调用状态对象的方法来实现的。在策略模式中,状态机的行为是由一组策略对象来实现的,每个策略对象负责处理一种状态。 下面是一个简单的Java状态机设计模式的示例代码: ```java // 状态接口 interface State { void handle(); } // 具体状态 class ConcreteStateA implements State { public void handle() { System.out.println("State A"); } } class ConcreteStateB implements State { public void handle() { System.out.println("State B"); } } // 状态机 class Context { private State state; public Context(State state) { this.state = state; } public void setState(State state) { this.state = state; } public void request() { state.handle(); } } // 测试代码 public class Test { public static void main(String[] args) { State stateA = new ConcreteStateA(); State stateB = new ConcreteStateB(); Context context = new Context(stateA); context.request(); context.setState(stateB); context.request(); } } ``` 在这个例子中,我们定义了一个状态接口和两个具体状态(ConcreteStateA和ConcreteStateB)。我们还定义了一个状态机(Context),它包含一个状态对象,并且可以通过调用setState方法来更改状态。最后,我们在测试代码中创建了一个状态机对象,并且依次调用了两种不同状态的handle方法。 这就是Java状态机设计模式的基本实现方式。通过这种模式,我们可以更加灵活地管理对象或系统在不同状态之间的转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值