我们以一个网约车订单场景来做一个简单的 demo 示例。订单分为四个状态 —— new(新建)、running(进行中)、cancel(取消)、end(结束)。当乘客下单时,订单状态进入 new 状态。这时,如果有司机接单,订单状态进入 running 状态;如果无司机接单,乘客取消订单,订单进入 cancel 状态。最后,乘客评价,running 状态的订单进入 end 状态。
* @description: 抽象状态 * @author: cuixiuyin * @date: 2019/01/16 08:57 */ public interface state { /*** * @description 乘客下单,订单创建 * @author cuixiuyin * @date 2019/01/16 08:59 */ void ordercreate(); /*** * @description 乘客取消,订单取消 * @author cuixiuyin * @date 2019/01/16 08:59 */ void ordercancel(); /*** * @description 司机接单,订单匹配 * @author cuixiuyin * @date 2019/01/16 08:59 */ void ordermatch(); /*** * @description 乘客评价,订单结束 * @author cuixiuyin * @date 2019/01/16 08:59 */ void evaluation(); }
这里,我们定义了一个抽象状态类,封装了与 context 的状态有关的行为 —— 乘客下单、乘客取消、司机接单、乘客评价。
public class newstate implements state { private order order; public newstate(order order) { this.order = order; } @override public void ordercreate() { system.out.println("您有一个订单等待司机接单,不可新建订单"); } @override public void ordercancel() { system.out.println("乘客取消订单,订单取消中..."); // 改变状态 new -> cancel order.setstate(order.getcancelstate()); } @override public void ordermatch() { system.out.println("司机接单中..."); // 改变状态 new -> running order.setstate(order.getrunningstate()); } @override public void evaluation() { system.out.println("新创建订单,不可评价"); } }
public class cancelstate implements state { private order order; public cancelstate(order order) { this.order = order; } @override public void ordercreate() { system.out.println("乘客下单,订单新建中..."); // 改变状态(取消后可以开始新一轮叫单) cancel -> new order.setstate(order.getnewstate()); } @override public void ordercancel() { system.out.println("订单已被取消,无可取消订单..."); } @override public void ordermatch() { system.out.println("无法接单,该订单已被乘客取消..."); } @override public void evaluation() { system.out.println("已取消订单不可评价..."); } }
public class runningstate implements state { private order order; public runningstate(order order) { this.order = order; } @override public void ordercreate() { system.out.println("您有订单在进行中,不可新建订单..."); } @override public void ordercancel() { system.out.println("正在行程中的订单,无法取消"); } @override public void ordermatch() { system.out.println("您有订单在进行中,不可接其他单"); } @override public void evaluation() { system.out.println("乘客评价订单,订单结束..."); // 改变状态 running -> end order.setstate(order.getendstate()); } }
public class endstate implements state { private order order; public endstate(order order) { this.order = order; } @override public void ordercreate() { system.out.println("乘客下单,订单新建中..."); // 改变状态(订单结束后可以开始新一轮叫单) end -> new order.setstate(order.getnewstate()); } @override public void ordercancel() { system.out.println("无可取消订单"); } @override public void ordermatch() { system.out.println("无可匹配订单"); } @override public void evaluation() { system.out.println("无可评价订单"); } }
这里,我们定义了四个具体状态类(new、cancel、running、end),每个状态类都持有 context 的引用,状态之间的切换由 context 实例来进行。
public class order { private state newstate; private state cancelstate; private state runningstate; private state endstate; // 默认订单已结束,可开始新一轮叫单 private state state; public order() { newstate = new newstate(this); cancelstate = new cancelstate(this); runningstate = new runningstate(this); endstate = new endstate(this); state = endstate; } void ordercreate() { state.ordercreate(); } void ordercancel() { state.ordercancel(); } void ordermatch() { state.ordermatch(); } void evaluation() { state.evaluation(); } public void setstate(state state) { this.state = state; } public state getnewstate() { return newstate; } public state getcancelstate() { return cancelstate; } public state getrunningstate() { return runningstate; } public state getendstate() { return endstate; } }
这里,我们定义了context,context 持有所有需要转换的状态实例,并把每一个行为动作都委托给状态来进行。
public class test { public static void main(string[] args) { order order = new order(); //1、新建订单 order.ordercreate(); //2、取消订单 order.ordercancel(); //3、新建订单 order.ordercreate(); //4、司机接单 order.ordermatch(); //5、尝试取消订单 order.ordercancel(); //6、乘客评价 order.evaluation(); } }
演示源代码:https://github.com/jmcuixy/design-patterns
如对本文有疑问, 点击进行留言回复!!
【面试题】研究过tomcat的NioEndpoint源码吗?请阐述下Reactor多线程模型在tomcat中的实现。
荐 厉害了!阿里P8架构师用4大技术文档带你深入解读爆火的中台战略
网友评论