状态模式允许一个对象在其内部状态发生改变时改变它的行为,使其看起来像是修改了其类。它通过将对象的行为包装在不同状态对象中,实现了在运行时更改对象的状态,从而影响其行为。
状态模式也有很多实际的应用场景,如:
在实际应用中,状态模式通常需要和其他设计模式结合使用,例如工厂模式、单例模式、策略模式等,以实现更灵活和高效的代码设计。
假设我们正在为一个订单系统,需要管理他的状态,比如它包含了已创建、已支付、已发货、已完成、已取消等状态。
首先定义一个状态接口
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.println("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方法)表现出了不同的行为。这就是状态模式的精髓:它将对象在不同状态下的行为封装到不同的状态对象中,使得状态的转换逻辑清晰,且易于扩展。