听说过状态模式的人可能没有那么多。 它不在我们熟悉的23种设计模式中。 但是,那是归属和行动模式之一。 今天一起学习学习状态模式吧!
在“状态模式”(State Pattern )中,类的行为取决于其状态。 这种类型的设计模式是行为模式。 通常,创建表示各种状态的对象和行为随状态对象的变化而变化的context对象。
状态模式的最大优点是,可以在内部状态发生变化时改变对象的行为,使对象看起来像修改了类一样。
主要解决方案可以根据对象的状态(属性)而变化相关联的行为。
使用场景:代码包含许多有关对象状态的条件语句。
如何使用,从订单的状态来看例子吧。
在电子商务系统中,购物过程中,订单通常都有这些状态,等待付款、等待出库、等待评估、等待完成。 的状态不同,用户看到的提示信息也不同。
根据上面的类图,首先实现抽象的状态接口。
span style=' color : # f8f8d4' publicinterfaceorderstate { void action (context context ); void doPrint (; (}/span暂挂付款实现类。
span style=' color : # f8f8d4' publicclasspendingpaymentstateimplementsorderstate { @ overridepublicvoidaction () } @ overe }}/span等待签出状态。
span style=' color : # f8f8d4' publicclasswaitoutstockstateimplementsorderstate { @ overridepublicvoidaction () } @ overrrid }}/span等待接收状态。
span style=' color : # f8f8d4' publicclasspendingdeliveryorderimplementsorderstate { @ overridepublicvoidaction (上下文相关) (}}/span等待评估的状态。
span style=' color : # f8f8d4' publicclasspendingevaluationimplementsorderstate { @ overridepublicvoidaction () } @ overrrid }}/span订单完成状态。
span style=' color : # f8f8d4' publicclasscompletedorderimplementsorderstate { @ ov }
erride public void action(Context context){ context.setOrderState(null); } @Override public void doPrint(){ System.out.println("订单完成状态"); }}</span>Context 类,订单状态变化引起行为变化。
<span style="color:#f8f8d4">public class Context{ private OrderState orderState; public Context(OrderState orderState){ this.orderState = orderState; } public void setOrderState(OrderState orderState){ this.orderState = orderState; } public void action(){ this.orderState.action(this); } public void printInfo(){ if (this.orderState != null){ this.orderState.doPrint(); } }}</span>下面使用 XttblogOrderDemo 类,模拟一下生产环境中的使用场景。
<span style="color:#f8f8d4">public class XttblogOrderDemo{ public static void main(String[] args){ OrderState orderState = new PendingPaymentState(); Context context = new Context(orderState); context.printInfo(); //用户付款 context.action(); context.printInfo(); //商家出库发货 context.action(); context.printInfo(); //用户签收 context.action(); context.printInfo(); //用户评价 context.action(); context.printInfo(); }}</span>总结下来,状态模式中涉及到 3 个角色。
环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。状态模式和策略模式的结构是比较相似的,但是两者却存在较大区别。策略模式是对算法或者策略建模,不涉及算法之间的切换。而状态模式是对状态进行建模,涉及状态之间的切换,其实就是状态机的模型,每种状态对应不同的处理逻辑。
状态模式在实际工作中非常的常用,比如:投票应用。一个在线投票系统的应用,要实现控制同一个用户只能投一票,如果一个用户反复投票,而且投票次数超过5次,则判定为恶意刷票,要取消该用户投票的资格,当然同时也要取消他所投的票;如果一个用户的投票次数超过8次,将进入黑名单,禁止再登录和使用系统。要使用状态模式实现,首先需要把投票过程的各种状态定义出来,根据以上描述大致分为四种状态:正常投票、反复投票、恶意刷票、进入黑名单。
叫号系统,取号,排队等待,办理业务,评价等。在比如游戏中的不同动作等。