状态模式(State)
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
当一个对象的行为取决于自身的状态,且在运行中时刻根据状态改变其自身的行为时,此时就可以运用到状态模式。
状态模式的使用可以避免大量的条件判断语句,使系统更有可读性。
- 优点
- 减少了条件语句的使用
- 可以体现状态的转变过程
- 状态对象可以共享
- 缺点
- 增加系统复杂度
- 使用场景
- 系统中有较多的条件语句时
- 对象运行中需要根据状态变化而不断改变其行为时
实例
角色说明
- State
- 状态接口
- ConcreteState
- 具体状态类
- Context
- 定义client交互接口
- 维护一个具体状态类
举例
订单的状态简单分为三种
- 创建订单
- 可转换为取消状态
- 可转换为完成状态
- 取消订单
- 可转换为创建状态
- 可转换为完成状态
- 完成订单
- 不可转换为创建状态
- 不可转换为取消状态
角色说明
- OrderState(State)
- 订单状态接口
- CreateState(ConcreteState)
- 创建状态
- CancelState(ConcreteState)
- 取消状态
- DoneState(ConcreteState)
- 完成状态
- OrderContext(Context)
- 订单环境
- Client
- 使用者
code
- OrderState.java
public interface OrderState {
void create(OrderContext orderContext);
void cancel(OrderContext orderContext);
void done(OrderContext orderContext);
}
- CreateState.java
public class CreateState implements OrderState {
@Override
public void create(OrderContext orderContext) {
System.out.println("\n工单已创建");
}
@Override
public void cancel(OrderContext orderContext) {
orderContext.setOrderState(OrderContext.CANCEL_STATE);
System.out.println("\n工单已取消");
}
@Override
public void done(OrderContext orderContext) {
orderContext.setOrderState(OrderContext.DONE_STATE);
System.out.println("\n工单完成");
}
}
- CancelState.java
public class CancelState implements OrderState {
@Override
public void create(OrderContext orderContext) {
orderContext.setOrderState(OrderContext.CREATE_STATE);
System.out.println("\n工单已创建");
}
@Override
public void cancel(OrderContext orderContext) {
System.out.println("\n工单已取消");
}
@Override
public void done(OrderContext orderContext) {
orderContext.setOrderState(OrderContext.DONE_STATE);
System.out.println("\n工单已完成");
}
}
- DoneState.java
public class DoneState implements OrderState {
@Override
public void create(OrderContext orderContext) {
System.out.println("\n工单已结束,不能再次创建");
}
@Override
public void cancel(OrderContext orderContext) {
System.out.println("\n工单已结束,不能取消");
}
@Override
public void done(OrderContext orderContext) {
System.out.println("\n工单执行完毕");
}
}
- OrderContext.java
public class OrderContext {
private OrderState orderState;
public final static CreateState CREATE_STATE = new CreateState();
public final static CancelState CANCEL_STATE = new CancelState();
public final static DoneState DONE_STATE = new DoneState();
public void setOrderState(OrderState orderState) {
this.orderState = orderState;
}
public void create() {
orderState.create(this);
getCurrentState();
}
public void cancel() {
orderState.cancel(this);
getCurrentState();
}
public void done() {
orderState.done(this);
getCurrentState();
}
private void getCurrentState() {
System.out.println("当前状态:" + orderState.getClass().getSimpleName());
}
}
- Client.java
public class Client {
public static void main(String[] args) {
OrderContext order = new OrderContext();
order.setOrderState(OrderContext.CREATE_STATE);
order.create();
order.cancel();
order.create();
order.done();
}
}
- output
工单已创建
当前状态:CreateState
工单已取消
当前状态:CancelState
工单已创建
当前状态:CreateState
工单完成
当前状态:DoneState
实例
暂无
总结
状态模式可以很大优化系统中的条件语句,且能根据状态动态修改行为,但是使用状态模式需要增加表状态的相关类和上下文,增加了系统的复杂程度。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: