状态模式

/ 设计模式

状态模式(State)

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

GoF23种设计模式中,属于行为型模式( Behavioral Patterns)

当一个对象的行为取决于自身的状态,且在运行中时刻根据状态改变其自身的行为时,此时就可以运用到状态模式。

状态模式的使用可以避免大量的条件判断语句,使系统更有可读性。

实例

状态者模式总览

角色说明

举例

订单的状态简单分为三种

状态模式举例

角色说明

code

public  interface OrderState {

     void create(OrderContext orderContext);

     void cancel(OrderContext orderContext);

     void done(OrderContext orderContext);
}
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工单完成");
    }
}
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工单已完成");
    }
}
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工单执行完毕");
    }
}
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());
    }

}
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();

    }
}
工单已创建
当前状态:CreateState

工单已取消
当前状态:CancelState

工单已创建
当前状态:CreateState

工单完成
当前状态:DoneState

实例

暂无

总结

状态模式可以很大优化系统中的条件语句,且能根据状态动态修改行为,但是使用状态模式需要增加表状态的相关类和上下文,增加了系统的复杂程度。