本文共 2276 字,大约阅读时间需要 7 分钟。
状态模式
(State Pattern) 中,类的行为是基于它的状态改变的。属于 行为型模式
。
在状态模式中,需要创建 表示各种状态的对象
以及他们的 共同抽象接口
和一个行为随着状态对象改变而改变的 context 对象
。
我们以下面一段代码使用状态模式进行重构,这是一个多重 IF 判断,当然在实际项目中,具体流程会更复杂,如果使用 if,将会产生大量的代码。
public class OrderServicePre { public String orderState(String state) { if (state.equals("0")) { System.out.println("订单已支付"); } if (state.equals("1")) { System.out.println("订单已发货"); } if (state.equals("2")) { System.out.println("订单派送中"); } if (state.equals("3")) { System.out.println("订单派送成功"); } if (state.equals("4")) { System.out.println("退货"); } if (state.equals("5")) { System.out.println("退货成功"); } return "没有订单信息"; }}
使用状态模式进行重构
首先创建订单状态抽象接口public interface OrderStateService { public String orderState();}
然后创建具体的实现类,表示订单的状态
public class PayService implements OrderStateService { @Override public String orderState() { return "订单已经支付"; }}
public class DeliveryService implements OrderStateService { @Override public String orderState() { return "订单派送状态"; }}
最后创建一个 Context 类,随着状态的改变,处理不同的逻辑
public class StateContext { private OrderStateService orderStateService; public StateContext(OrderStateService orderState) { this.orderStateService = orderState; } public String exchangeState() { return orderStateService.orderState(); }}
测试类
public class Main { public static void main(String[] args) { StateContext pay = new StateContext(new PayService()); System.out.println(pay.exchangeState()); StateContext delivery = new StateContext(new DeliveryService()); System.out.println(delivery.exchangeState()); }}
策略模式
和 状态模式
有什么区别策略模式
根据情况采用不同策略做相同的事,返回相同结果
比如说支付,尽管有微信,支付宝,银联,但是都是支付这件事,返回的都是支付结果。
状态模式
做不同的事,返回不同的结果
比如说货物派送,不同的状态,返回不同的结果,数据 共同点
类图一样,但需求不一样
优点
1、避免多重判断,解耦,降低复杂度
2、提高代码重用度,根据不同状态调用具体实现类缺点
1、增加系统类和对象的个数
2、增加功能的时候,需要修改切换状态的代码1、行为随状态改变而改变的场景。
2、条件、分支语句的代替者。—— 完
公众号:【星尘Pro】
github:
推荐阅读
https://www.runoob.com/design-pattern/state-pattern.html
https://www.runoob.com/w3cnote/state-vs-strategy.html
转载地址:http://lyfsi.baihongyu.com/