设计模式--状态模式

 

定义:状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样

场景:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为;操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

例子: 订单系统中的状态

在这里插入图片描述


// 需要优化的代码
public String orderState(String state) {
        if (state.equals("0")) {
            return "已经发货";
        }
        if (state.equals("1")) {
            return "正在运送中...调用第三方快递接口 展示 运送信息";
        }
        if (state.equals("2")) {
            return "正在派送中... 返回派送人员信息";
        }
        if (state.equals("3")) {
            return "已经签收,提示给用户快递员评价";
        }
        if (state.equals("4")) {
            return "拒绝签收, 重新开始申请退单";
        }
        if (state.equals("5")) {
            return "订单交易失败,调用短信接口提示 ";
        }
        return "未找到对应的状态";
    }
}







// 状态接口

public interface OrderState {
    Object orderService();
}

public class AlreadySignedOrderState implements OrderState {
    @Override
    public Object orderService() {
        log.info(">> 切换已经签收状态..");
        return "切换已经签收状态";
    }
}

public class InTransitOrderState implements OrderState {
    @Override
    public Object orderService() {
        log.info(">> 切换为正在运送状态..");
        return "切换为正在运送状态";
    }
}


public class ShippedAlreadyOrderState implements OrderState {
    @Override
    public Object orderService() {
        log.info(">> 切换为已经发货状态..");
        return "切换为已经发货状态";
    }
}


// 调用状态的对象
public class StateContext {
    private OrderState orderState;

    public StateContext(OrderState orderState) {
        this.orderState = orderState;
    }

    public void switchStateOrder() {
        orderState.orderService();
    }
}


// 测试
public class Test {
    public static void main(String[] args) {
        StateContext stateContext = new StateContext(new ShippedAlreadyOrderState());
        stateContext.switchStateOrder();
    }
}

 

状态模式与策略模式区别:

状态模式重点在各状态之间的切换从而做不同的事情,而策略模式更侧重于根据具体情况选择策略,并不涉及切换;


状态模式封装了对象的状态,而策略模式封装算法或策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值