一、定义及应用场景:
状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。它通过将对象的行为包装在不同状态对象中,实现了在运行时更改对象的状态,从而影响其行为。
(图片来源网络,侵删)
状态模式也有很多实际的应用场景,如:
1、订单状态管理:订单状态有很多种,如未付款、已付款、已发货、已签收等。不同状态下,订单的行为也不同。
(图片来源网络,侵删)
2、游戏角色状态:游戏角色的状态有很多种,如待机、行走、攻击、受伤等。不同状态下,角色的行为也不同。
3、音视频播放器:音视频播放器的状态有很多种,如播放、暂停、停止、快进、快退等。不同状态下,播放器的行为也不同。
在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计。
二、示例
假设我们正在为一个订单系统,需要管理他的状态,比如它包含了已创建、已支付、已发货、已完成、已取消等状态。
首先定义一个状态接口:
public interface OrderState { void next (Order order) ; void previous (Order order) ; void printStatus() ; }
然后定义具体的状态类,为每个具体状态实现上述接口。这里以两个状态为例:已创建和已支付。
public class CreatedState implements OrderState { @Override public void next(Order order) { order.setState(new PaidState() ) ; } @Override public void previous(Order order) { System.out.println("The order is in its root state"); } @Override public void printStatus() { System.out.print1n("Order created."); } } public class PaidState implements OrderState { @Override public void next (Order order) { order.setState(new ShippedState()) ; } @Override public void previous(Order order) { order.setState(new CreatedState()) ; } @Override public void printStatus() { System.out.println("Order paid.") ; } }
最后定义一个Order类,持有一个状态对象的引用,通过该状态对象的方法实现状态的切换。
public class Order { private OrderState state ; public Order() { //订单初始化状态为已创建 this.state = new CreatedState() ; } public void setState(OrderState state ) { this.state = state ; } public OrderState getState() { return this.state ; } public void nextStep() { state.next(this) ; } public void previousStep() { state.previous(this) ; } public void printStatus( ) { state.printStatus() ; } }
使用示例如下:
public class StatePatternDemo { public static void main(String[ ] args) { Order order = new Order() ; order.printStatus() ; order.nextStep() ; order.printStatus() ; order.nextStep() ; order.printStatus() ; } }
在这个例子中,Order对象根据其内部状态的改变(通过调用nextStep或previousStep方法)表现出了不同的行为。这就是状态模式的精髓:它将对象在不同状态下的行为封装到不同的状态对象中,使得状态的转换逻辑清晰,且易于扩展。
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...