状态模式,一招帮你摆脱冗长的 if else
2022-05-14 本文已影响0人
程就人生
状态模式,该如何把状态提出来呢?
状态模式,真的可以摆脱冗长的 if else 吗?
状态模式(State Pattern),是把对象的状态属性,从对象里分离出来,每种状态作为一个单独的类,状态改变行为也改变的场景。它是一种行为型模式。
业务场景:对象的行为依赖它的状态属性的场景。
关键代码:创建表示各种状态的对象,和一个行为随状态对象而改变的上下文对象。
下面看UML类图:
类图说明:图中有六个类,订单状态接口类IOrderState;订单的四种状态实现类,待支付状态类NopayState,支付待发货状态类NoDeliverState,发货状态类DeliverState,订单状态完成类FinishState;还有一个订单类Order,订单状态就是从这个类中分离出去的。
图中有两种关系:订单状态实现类及订单状态接口是实现关系,而订单状态与订单是相互依赖关系。模式之间最重要的就是类之间的关系了。
下面看代码实现:
1.订单状态接口;
/**
* 1.订单状态接口
* @author 程就人生
* @Date
*/
public interface IOrderState {
// 状态改变时做点什么
public void doAction(Order order);
}
2.订单状态实现类;
/**
* 3.订单
* @author 程就人生
* @Date
*/
public class Order {
private IOrderState state;
private String goodsName;
public Order() {
this.state = null;
}
public IOrderState getState() {
return state;
}
public void setState(IOrderState state) {
this.state = state;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
}
3.订单类;
/**
* 3.订单
* @author 程就人生
* @Date
*/
public class Order {
private IOrderState state;
private String goodsName;
public Order() {
this.state = null;
}
public IOrderState getState() {
return state;
}
public void setState(IOrderState state) {
this.state = state;
}
public String getGoodsName() {
return goodsName;
}
public void setGoodsName(String goodsName) {
this.goodsName = goodsName;
}
}
4.测试代码;
public static void main(String[] argo){
// 用户从电商平台的购物车点击一箱苹果,进入了结算页面
Order order = new Order();
order.setGoodsName("一箱苹果");
// 提交订单前犹豫了一下,没有付款
IOrderState nopayState = new NopayState();
nopayState.doAction(order);
order.setState(nopayState);
// 再不付款,就要被取消了,还是付了吧
IOrderState nodeliverState = new NodeliverState();
nodeliverState.doAction(order);
order.setState(nodeliverState);
// 商家收到付款提醒,赶紧发货
IOrderState deliverState = new DeliverState();
deliverState.doAction(order);
order.setState(deliverState);
// 收到货物,点击确认收货按钮
IOrderState finishState = new FinishState();
finishState.doAction(order);
order.setState(finishState);
}
运行结果:
用户订单:一箱苹果,未付款,未付款订单保留12小时,12小时后会被取消。
用户订单:一箱苹果,已付款,商家正在备货。
用户订单:一箱苹果,已发货,快递小哥快马加鞭配送中。
用户订单:一箱苹果,已签收。
这段代码的意思是:用户下了一个订单,但是没有支付,支付后等待发货,发货后等待收货,收货后点击签收完成。这就是一个订单的状态改变过程,它的状态每次发生变化时,总会影响订单行为的改变。这就是状态模式的简单实现。
最后总结
状态模式,可以解决使用 if else 判断状态并且状态过多的问题。对象的状态和对象分离后,又相互依赖,这也是违背了开闭原则的原因。没有完美的模式,用或不用,完全取决于取和舍。